Pythonic将两个不同长度的列表压缩到字典

时间:2018-04-19 16:01:34

标签: python python-3.x combinations enumerate

我有两个不同长度的字符串列表:

k = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
v = ['z', 'y', 'x', 'w',]
dict = {}

我希望得到以下输出:

{'a': ['z', 'y', 'x', 'w',], 'b': ['z', 'y', 'x', 'w',], 'c': ['z', 'y', 'x', 'w',], 'd': ['z', 'y', 'x', 'w',], 'e': ['z', 'y', 'x', 'w',], 'f': ['z', 'y', 'x', 'w',], 'g': ['z', 'y', 'x', 'w',]}    

我最接近的是:

{key: [key, value] for key, value in zip(k, v)}

(kvalue,vvalue) for kkey, kvalue in enumerate(k) for vkey, vvalue in enumerate(v)

这样做的最终目标是使用键值对将包含的字符串插入到单独的for循环中的字符串中。我使用的是Python 3.6。

伪代码:

for filenames in directory:
    var = 'some string' + each key/value pairing
    print(var)

>>> some string a z
>>> some string a y
>>> some string a x
>>> some string a w
>>> some string b z
>>> some string b y
>>> some string b x
>>> some string b w
>>> some string c z
>>> some string c y
>>> some string c x
>>> some string c w
>>> some string d z
>>> some string d y
>>> some string d x
>>> some string d w
>>> some string e z
>>> some string e y
>>> some string e x
>>> some string e w
>>> some string f z
>>> some string f y
>>> some string f x
>>> some string f w
>>> some string g z
>>> some string g y
>>> some string g x
>>> some string g w

4 个答案:

答案 0 :(得分:2)

对于问题的第一部分,请使用dict.fromkeys()

k = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
v = ['z', 'y', 'x', 'w',]
d = dict.fromkeys(k, v)

输出:

{'a': ['z', 'y', 'x', 'w'],
 'b': ['z', 'y', 'x', 'w'],
 'c': ['z', 'y', 'x', 'w'],
 'd': ['z', 'y', 'x', 'w'],
 'e': ['z', 'y', 'x', 'w'],
 'f': ['z', 'y', 'x', 'w'],
 'g': ['z', 'y', 'x', 'w']}

对于第二部分,您实际上不需要第一部分,请使用itertools.product

from itertools import product

k = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
v = ['z', 'y', 'x', 'w',]

out = ['some string {} {}'.format(key, val) for key, val in product(k, v)]

输出:

['some string a z',
 'some string a y',
 'some string a x',
 'some string a w',
 'some string b z',
 'some string b y',
 'some string b x',
 'some string b w',
 'some string c z',
 'some string c y',
 'some string c x',
 'some string c w',
 'some string d z',
 'some string d y',
 'some string d x',
 'some string d w',
...

答案 1 :(得分:1)

您可以使用词典理解:

result = {x: v for x in k}
print(result)
{'a': ['z', 'y', 'x', 'w'], 'b': ['z', 'y', 'x', 'w'], 'c': ['z', 'y', 'x', 'w'], 'd': ['z', 'y', 'x', 'w'], 'e': ['z', 'y', 'x', 'w'], 'f': ['z', 'y', 'x', 'w'], 'g': ['z', 'y', 'x', 'w']}

这会创建一个字典,其中包含来自x的键k和值v

答案 2 :(得分:0)

词典理解会做:

k = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
v = ['z', 'y', 'x', 'w',]
print({key: v for key in k})

# {'a': ['z', 'y', 'x', 'w',], 'b': ['z', 'y', 'x', 'w',], 'c': ['z', 'y', 'x', 'w',], 'd': ['z', 'y', 'x', 'w',], 'e': ['z', 'y', 'x', 'w',], 'f': ['z', 'y', 'x', 'w',], 'g': ['z', 'y', 'x', 'w',]} 

答案 3 :(得分:0)

您完全使用了错误的方法:zip仅用于对应的对,为您提供(a z) (b y) (c x)等等,而不提供其他配对。

是否有某些原因需要多次生成?如果没有,这是itertools.product的作业,而不是zip

from itertools import product

k = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
v = ['z', 'y', 'x', 'w',]

for pair in product(k, v):
    print("some string " + ' '.join(pair))

输出:

some string a z
some string a y
some string a x
some string a w
some string b z
some string b y
some string b x
some string b w
...
some string g x
some string g w