0

我有一个字典列表。可以假设每个列表都有相同格式的字典。我们称这种格式为:

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按如下方式从列表中打破所有 's,但我无法找到一个优雅的解决方案来对a's进行排序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

4 回答 4

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])]
于 2013-08-15T22:42:26.327 回答
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]]
于 2013-08-15T22:44:44.083 回答
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]
于 2013-08-15T22:39:28.873 回答
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]
于 2013-08-15T22:42:32.320 回答