(如果想出更简洁的主题标题,请注意编辑)
有可能吗?
我有三个列表,合并它们:
merged = {keys_[i]:[first_list[i], second_list[i]] for i in xrange(len(keys_))}
由于我的列表keys_
有一些基本元素,因此字典的长度缩小了重复的键。我知道字母键不可能是唯一的,但也许有一些解决方法吗?
@ EDIT
回应评论:
我只想将三个列表合并为一个词典。
keys_ = ['100', '600', '100']
first_list = ['animals', 'cars', 'people']
second_list = ['cat', 'Fiat', 'John']
我想要的就是:
merged = {'100': ['animals', 'cat'], '600': ['cars', 'Fiat'], '100': ['people', 'John']}
我想保留所有密钥(100
),以防止它们被覆盖。
答案 0 :(得分:3)
这样的事情:每个重复的键都以列表的形式包含它的值。
In [12]: from collections import defaultdict
In [13]: dic=defaultdict(list)
In [14]: for a,b,c in zip(keys_,first_list,second_list):
dic[a].append([b,c])
....:
In [15]: dic
Out[15]: defaultdict(<type 'list'>,
{'100': [['animals', 'cat'], ['people', 'John']],
'600': [['cars', 'Fiat']]})
答案 1 :(得分:1)
猜测你的问题,这可能对你有用:
from itertools import chain
from collections import defaultdict
merged = defaultdict(list)
for key, value in chain(first_list.iteritems(), second_list.iteritems()):
merged[key].append(value)
如果词典是{1: 11}
和{1: 21, 2: 22}
,则此代码会生成{1: [11, 21], 2:[22]}
。
答案 2 :(得分:1)
当我们使用csv文件时,我们会看到类似的问题,其中第一行值因某种原因而显着。如果我正在处理这个问题,我会非常努力地考虑这个数据结构是否最有用,并且随着时间的推移会持续存在。如果是,如果你只需要一本字典,那么我会做类似下面的事情
from collections import defaultdict:
myDict = default_dict(list)
keys_ = ['100', '600', '100']
first_list = ['animals', 'cars', 'people']
second_list = ['cat', 'Fiat', 'John']
for numb, key in enumerate(keys_):
unique = str(numb)
myDict[key + '_' + unique ].append(first_list[numb])
myDict[key + '_' + unique ].append(second_list[numb])
这个问题虽然是你真的无法概括。我不是一个优秀的程序员,但我确实试着想一想如何才能使这个问题更加通用,所以下次我看到一个与此类似的问题我已经知道了答案。这需要做很多工作才能将其应用到下一个案例中。
这并不能完全满足您的需求,但您可以处理您的密钥并将它们拆分为下划线(如果它们非常重要,如果它们不重要则可以按原样使用它们。)
如果我们有类似的东西,我通常会添加一个新密钥,它只是列表中项目位置的索引号
{0:['100','animals',cat], 1:['600','cars','Fiat'], 2:['100','People','John']}
我们必须在读取其他人生成的CSV文件时执行此操作,当“真正的”列标题分布在两行或更多行时就是这种情况
但是这个解决方案和我之前的解决方案至少要求列表具有相同的长度(缺少值由某种空白表示,并非总是如此。
答案 3 :(得分:1)
使用列表字典是常用方法。
您可能也可以使用duptreap: http://stromberg.dnsalias.org/~strombrg/treap/ 该模块带有一个独特的类似键盘的界面,但也是一个允许重复键的版本。
HTH