2015-07-11 78 views
3

我试图用交替条目创建一个循环字典,虽然条目不一定需要交替,只要它们都在字典中,我只是需要最简单的解决方案将它们全部放在一本字典中。什么我想一个简单的例子来实现:用Python中的循环创建一个交替字典

通常情况下,创建一个字典,一个循环我这样做:

{i:9 for i in range(3)} 
output: {0: 9, 1: 9, 2: 9} 

现在我想要的follwing:

{i:9, i+5:8 for i in range(3)} 
SyntaxError: invalid syntax 

所需的输出是:

{0:9, 5:8, 1:9, 6:8, 2:9, 7:8} 

或者,这也输出就可以了,只要所有元素都在字典(顺序并不重要):

{0:9, 1:9, 2:9, 5:8, 6:8, 7:8} 

的背景是,我使用

theano.clone(cloned_item, replace = {replace1: new_item1, replace2: new_item2}) 

要更换必须在一个字典中给出的所有项目。

提前致谢!

+0

不仅订单没有关系到你的序列工作,它根本不重要:字典是任意订购的。 – TigerhawkT3

+2

哦,现在我看到你有'8'键多次了。对于标准字典来说这是不可能的。 – TigerhawkT3

+0

谢谢。这是一个不幸的例子,关键是我的情况是独一无二的。关键是我不知道如何解决语法来创建一个循环。等等,让我调整示例,使密钥是唯一的 – User01

回答

2

理解很酷,但并非绝对必要。此外,标准字典不能有重复的密钥。有data structures for that,但你也可以尝试有值的list该键:

d = {} 
d[8] = [] 
for i in range(3): 
    d[i] = 9 
    d[8].append(i) 

 

>>> d 
{8: [0, 1, 2], 0: 9, 2: 9, 1: 9} 

对于新例如不重复键:

d = {} 
for i in range(3): 
    d[i] = 9 
    d[i+5] = 8 

 

>>> d 
{0: 9, 1: 9, 2: 9, 5: 8, 6: 8, 7: 8} 
3

您可以拉动这一关在一个符合itertools

dict(itertools.chain.from_iterable(((i, 9), (i+5, 8)) for i in range(3))) 

解释:

的内部产生了一堆的元组

((i, 9), (i+5, 8)) for i in range(3) 

这名单表格扩展为

[((0, 9), (5, 8)), ((1, 9), (6, 8)), ((2, 9), (7, 8))] 

chain.from_iterable然后通过水平压平就产生

[(0, 9), (5, 8), (1, 9), (6, 8), (2, 9), (7, 8)] 

这当然与dict init,可以采用元组