Python快速排列lis的技巧

2024-05-15 15:11:04 发布

您现在位置:Python中文网/ 问答频道 /正文

又来了。 我有这个:

[
 [{'location': u'Austria',      u'number': 33},
 {'location':  u'Albania',      u'number': 29},
 {'location':  u'Afghanistan',  u'number': 666}],

 [{'location': u'Austria',      u'items': 6},
 {'location':  u'Albania',      u'items':  1},
 {'location':  u'Afghanistan'}, u'items':  0],

 [{'location': u'Austria',      u'loss': 1.0},
 {'location':  u'Albania',      u'loss': 2.0},
 {'location':  u'Afghanistan',  u'loss': 6.6}]
]

我试过生成这样的列表:

[
 [u'Austria',     33,  6, 1.00], 
 [u'Albania',     29,  1, 2.00], 
 [u'Afghanistan', 666, 0, 6.60]
]

我试过这个:

country = [i['location'] for i in data[0]]
number =  [i['number'] for i in data[0]]
items =   [i['items'] for i in data[1]]
loss =    [i['loss'] for i in data[2]]

然后我打开这个:

for i in range(0,len(country)):
        l.append([name[i], number[i], items[i], loss[i]])

以及它的工作,但是: 1) (对我来说)很难看 2) 不是“一刀切”

在其他时间,我可能只有:

[
 [{'location': u'Austria',      u'number': 33},
 {'location':  u'Albania',      u'number': 29},
 {'location':  u'Afghanistan',  u'number': 666}],

 [{'location': u'Austria',      u'loss': 1.0},
 {'location':  u'Albania',      u'loss': 2.0},
 {'location':  u'Afghanistan',  u'loss': 6.6}]
]

我的代码将失败(索引外),其他时间我可能有更多的列表中的列表,等等。 这怎么行?你知道吗


Tags: innumber列表fordatalen时间items
2条回答

这个怎么样?你知道吗

from collections import OrderedDict

od=OrderedDict()
for dl in data:
  for d in dl:    
    loc = d['location']
    od.setdefault(loc,{}).update(**d)

for k in od: print od[k]

{u'loss': 1.0, 'location': u'Austria', u'number': 33}
{u'loss': 2.0, 'location': u'Albania', u'number': 29} 
{u'loss': 6.6, 'location': u'Afghanistan', u'number': 666}

它将任何一组目录键累积到一个目录中,并保留位置的原始顺序。你知道吗

从这里开始,如果您想要一个列表列表,其中包含任何顺序的字段:

fields=['location', 'loss', 'number'] 
lofl = [[ oo[k][x] for x in fields] for k in oo ]

>>> lofl
[[u'Austria', 1.0, 33], [u'Albania', 2.0, 29], [u'Afghanistan', 6.6, 666]]

首先,我把它调换一下,这样所有的澳大利亚都在一起了:

data_t = zip(*data)

然后我将通过拔出sub dict中的第一个非'location'键来累积行(因为这似乎就是您要查找的字段)。你知道吗

rows = []
for country_dat in data_t:
    country = country_dat[0]['location']
    row = [country]
    rows.append(row)
    for dct in country_dat:
        key = next(k for k in dct if k != 'location')
        row.append(dct[key])

相关问题 更多 >