繁体   English   中英

从Python中的列表列表进行设置

[英]Make sets from a list of lists in Python

我有以下形式的清单清单:

testdata = [['9034968', 'ETH'],  ['14160113', 'ETH'],  ['9034968', 'ETH'],  
            ['11111', 'NOT'], ['9555269', 'NOT'],  ['15724032', 'ETH'],  
            ['15481740', 'ETH'],  ['15481757', 'ETH'],  ['15481724', 'ETH'],   
            ['10307528', 'ETH'],  ['15481757', 'ETH'],  ['15481724', 'ETH'],
            ['15481740', 'ETH'],  ['15379365', 'ETH'],  ['11111', 'NOT'],
            ['9555269', 'NOT'],  ['15379365', 'ETH']]

我想要一个将唯一名称与其值分组的最终结果。 因此,在最终列表(或字典或任何可迭代的列表)中,只有两个名称(ETH和NOT),其中列表作为所有其他值的第二项,例如:

In [252]: unique_names
Out[252]: 
{'ETH': ['9034968',
  '14160113',
  '9034968',
  '15724032',
  '15481740',
  '15481757',
  '15481724',
  '10307528',
  '15481757',
  '15481724',
  '15481740',
  '15379365',
  '15379365'],
 'NOT': ['11111', '9555269', '11111', '9555269']}

为此,我使用了字典和以下步骤:

unique_names = []

for (x,y) in testdata: 
    if y not in unique_names:
       unique_names.append(y)

# now unique_names is ['ETH', 'NOT']

unique_names = {name:list() for name in unique_names}

for (x,y) in testdata: unique_names[y]=unique_names[y]+[x]

#so finally I get the result above

我的问题是:

  • test_data是具有1000个条目的SQL查询的结果。 我的解决方案运行得很慢(至少是这样)。
  • 您能以更Python化的方式做到这一点吗?

该问题的示例数据来自以下类似的关于集合和列表的问题: Python:列表列表的唯一性 不幸的是,那里的OP希望得到不同的结果,但是数据结构足够合适。

您可以像这样使用defaultdict

from collections import defaultdict
d = defaultdict(list)

for (value, key) in testdata:
    d[key].append(value)

print d

或搭配普通字典

d = {}
for (value, key) in testdata:
    d.setdefault(key, []).append(value)
print d

两个示例都基于相同的思想。 他们基于键将值分组为列表。 如果字典中不存在该键,则dict.setdefault将为其分配默认值,然后将返回该值。 我们只是将值追加到与键对应的列表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM