我有一个词典列表。可以假设每个列表具有相同格式的字典。我们称之为格式:
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]
答案 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]