-1

(如果想出更简洁的主题标题,请注意编辑)

有可能吗?

我有三个列表,将它们合并:

merged = {keys_[i]:[first_list[i], second_list[i]] for i in xrange(len(keys_))}

而且由于我的列表keys_有一些相同的元素,字典的长度已经缩小了重复键。我知道 dict 键不能是相同的,但也许有一些方法可以解决它?

@ 编辑

回复评论:

我只是想将三个列表合并到一个字典中。

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),以防止它们被覆盖。

4

4 回答 4

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']]})
于 2013-04-28T16:26:56.580 回答
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]}.

于 2013-04-28T16:24:09.923 回答
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 文件时,我们有时必须这样做,当“真实”列标题分布在两行或多行时就是这种情况

但是这个解决方案和我之前的解决方案至少要求列表的长度相同(缺失值由某种空白表示,但情况并非总是如此。

于 2013-04-28T17:24:25.900 回答
1

使用列表字典是常用的方法。

您可能还可以使用 duptreap: http ://stromberg.dnsalias.org/~strombrg/treap/ 这个模块带有一个独特的类似 key-dict 的界面,但也有一个允许重复密钥的版本。

高温高压

于 2013-04-28T17:59:06.173 回答