搜索列表列表

时间:2012-02-22 15:35:06

标签: python

我有一个像这样的数据列表

data = [['A',11],['A',22],['B',14],['C',23],['C',31],['B',12]]

我将这些独特的项目放在另一个列表中:

search=[]
for item in data:
    if search.count(item[0]) == 0:
        search.append(item[0])

# search contains ['A', 'B', 'C']

如何使用列表data搜索列表search并生成类似的输出?

['A', [11,22]]
['B', [14,12]]
['C', [23,31]]

6 个答案:

答案 0 :(得分:6)

使用字典:

d = {}
for k, v in data:
    d.setdefault(k, []).append(v)
print d

打印

{'A': [11, 22], 'C': [23, 31], 'B': [14, 12]}

您可以使用d.keys()获取所有密钥的列表。

不是建立列表data,而是从一开始就使用字典可能会更好。

(其他人会尽快推荐defaultdict。在这种情况下,我更喜欢dict,但这并不重要。)

答案 1 :(得分:5)

我会使用defaultdict,如下所示:

from collections import defaultdict

dd = defaultdict(list)
for key, val in data:
    dd[key].append(val)

# dd.iteritems() will give you your output.

答案 2 :(得分:2)

data = [['A',11],['A',22],['B',14],['C',23],['C',31],['B',12]]
d = {}
for k, v in data:
    d.setdefault(k, []).append(v)

for item in sorted(d.iteritems()):
    print list(item)

打印

['A', [11, 22]]
['B', [14, 12]]
['C', [23, 31]]

但请考虑保留d字典:

{'A': [11, 22], 'B': [14, 12], 'C': [23, 31]}

它可以让您更轻松地访问这些值。

答案 3 :(得分:1)

您应该使用dict执行此任务(或必要时使用OrderedDict)。请阅读python文档:http://docs.python.org/library/stdtypes.html#mapping-types-dict

答案 4 :(得分:1)

创建一个键值对的字典,其中每个键是数据元组中的第一个元素(您只能在字典中使用唯一键),并且该值是元组中所有项目的列表。键。

map = {}
for item in data:
  if map.has_key(item[0]):
    map[item[0]].append(item[1])
  else:
    map[item[0]] = []
    map[item[0]].append(item[1])

>>> map
{'A': [11, 22], 'C': [23, 31], 'B': [14, 12]}

答案 5 :(得分:1)

您还可以使用理解:

grouped_data = dict((x[0],list(y[1] for y in data if y[0]==x[0])) for x in data)

请注意,与其他解决方案不同,此解决方案具有二次复杂性,请勿在非常大的列表中使用它。