按主题划分列表

时间:2013-08-15 22:33:09

标签: python list python-3.x

我有一个词典列表。可以假设每个列表具有相同格式的字典。我们称之为格式:

dict_sample={'a':0,'b':1}

我们还要说a是一个随机整数,而b可以是几个数字之一(或者字符串,就此而言)。我希望按a对所有b值进行排序。例如,如果我有一个如下列表:

a    b
54   1
25   0
53   1
532  2
132  0

list=[{'a':54,'b':1},{'a':25,'b':0},{'a':53,'b':1},{'a':532,'b':2},{'a':132,'b':0}]

我想将其分解为3个列表。列表将包括(订单不重要)

0 list-> [25,132]
1 list-> [54,53]
2 list-> [532]

我知道我可以从列表中删除所有a,如下所示,但我无法找到一个优雅的解决方案来按a'对b进行排序秒。有什么建议?到目前为止我的代码看起来像:

[row['a'] for row in list]

我想要的是这样的:

index=0      #This could be looped through, or just chosen for one specific value
[row['a'] if row['b']==index for row in list]

4 个答案:

答案 0 :(得分:3)

from collections import defaultdict

data=[{'a':54,'b':1},{'a':25,'b':0},{'a':53,'b':1},{'a':532,'b':2},{'a':132,'b':0}]

output = defaultdict(list)

for d in data:
    output[d['b']].append(d['a'])

output = sorted((k, v) for k, v in output.items())

print output

<强>输出:

[(0, [25, 132]), (1, [54, 53]), (2, [532])]

答案 1 :(得分:1)

一个有效(紧凑)的解决方案是:

output= { ok: [ ie['a'] for ie in list if ie['b'] == ok ] for ok in { e['b'] for e in list } }

请注意{ e['b'] for e in list }是一种集合理解(该语言的相对较新的特征)。大致相当于set([ e['b'] for e in list ])

我在CPython 3.3.2上测试了它,它产生了预期的结果,除了在字典中。恕我直言,这些列表在字典中比其他地方更有用,但要遵守这个问题:

list_0= output[0]
list_1= output[1]
list_2= output[2]

答案 2 :(得分:1)

如果您已经知道所有b值,那么这将是微不足道的。您需要每个b值的列表,其中每个值都包含具有该a值的每个字典中的所有b值。你几乎可以直接从英语翻译成一种理解:

[[d['a'] for d in lst if d['b']==b] for b in bs]

您没有b值,但只需再次传递即可获得这些值:

bs = (d['b'] for d in lst)

除了您显然只需要唯一值,并且您希望按排序顺序迭代它们,所以:

bs = sorted(set(d['b'] for d in lst))

这就是它的全部内容。把它放在一起:

>>> lst=[{'a':54,'b':1},{'a':25,'b':0},{'a':53,'b':1},{'a':532,'b':2},{'a':132,'b':0}]
>>> bs = sorted(set(d['b'] for d in lst))
>>> [[d['a'] for d in lst if d['b']==b] for b in bs]
[[25, 132], [54, 53], [532]]

答案 3 :(得分:0)

mylist=[{'a':54,'b':1},{'a':25,'b':0},{'a':53,'b':1},{'a':532,'b':2},{'a':132,'b':0}]

>>> zerolist, onelist, twolist = [], [], []
>>> for x in mylist:

        if 0 in x.values():
            zerolist.append(x['a'])
        elif 1 in x.values():
                onelist.append(x['a'])
        elif 2 in x.values():
                onelist.append(x['a'])
>>> >>> zerolist
[25, 132]