[英]Sorting Lists of List of Dictionaries
我刚刚读了一个类似以下的文件:
name: john, jane
car: db9, m5
food: pizza, lasagne
这些行(名称,汽车,食物)中的每一行都是谁拥有的顺序。 因此,约翰拥有“ DB9”汽车,而他最喜欢的食物是“比萨”。 与简一样,她的车是“ M5”,她最喜欢的食物是“千层面”。
我实际上有:
>>> names['Name']="John"
>>> namesL.append(name)
>>> names['Name']="Jane"
>>> namesL.append(name)
>>> car['Car']="DB9"
>>> cars.append(car)
>>> car['Car']="M5"
>>> cars.append(car)
>>> food['Food']="Pizza"
>>> foodL.append(food)
>>> food['Food']="Lasagne"
>>> foodL.append(food)
>>>ultimateList.append(foodL)
...
但是我想要它,以便所有这些东西都在各自的字典中。 所以像这样:
>>>PersonalDict
{'Name': 'John', 'Car': 'DB9', 'Food': 'Pizza'}
我一直盯着它看了一段时间,无法弄清楚该如何处理。 任何人都可以提出一些想法,还是我应该以其他方式这样做?
看起来您想要这样的东西:
import collections
data = '''name: john, jane
car: db9, m5
food: pizza, lasagne
'''
personal_list = collections.defaultdict(dict)
for line in data.splitlines():
key, _, info = line.partition(':')
infos = info.split(',')
key = key.strip().title()
for i, item in enumerate(infos):
item = item.strip().title()
personal_list[i][key] = item
for i in personal_list:
print personal_list[i]
但这与您指定的功能不完全相同(例如, DB9
B
的大写字母看起来很奇怪-代码如何知道将特定的第二个字母而不是其他任何第二个字母大写?!),但看起来似乎很接近。
尝试:
f = open('filename.txt')
result = []
for line in f:
key, values = line.split(':')
values = values.rstrip().split(', ')
for i, value in enumerate(values):
try:
result[i][key] = value
except IndexError:
result.append({ key: value})
print result
从那里将初始数据拆分为索引/键/值三元组。
def parse_data(lines):
for line in lines:
key, _, data = line.partition(':')
for i, datum in enumerate(x.strip() for x in data.split(',')):
yield i, key, datum
在这里,您可以使用Alex的defaultdict方法(可能是最好的)或排序以及大量额外的代码来汇总数据,以根据需要构建单个词典。
向发电机致敬:
#!/usr/bin/env python
data=(zip(*([elt.strip().title() for elt in line.replace(':',',',1).split(',')]
for line in open('filename.txt','r'))))
personal_list=[dict(zip(data[0],datum)) for datum in data[1:]]
print(personal_list)
# [{'Food': 'Pizza', 'Car': 'Db9', 'Name': 'John'}, {'Food': 'Lasagne', 'Car': 'M5', 'Name': 'Jane'}]
为了了解脚本的工作原理,我们将其分解:
首先,我们将filename.txt加载到行列表中:
In [41]: [line for line in open('filename.txt','r')]
Out[41]: ['name: john, jane\n', 'car: db9, m5\n', 'food: pizza, lasagne\n']
接下来,我们将第一个冒号(:)替换为逗号(,)
In [42]: [line.replace(':',',',1) for line in open('filename.txt','r')]
Out[42]: ['name, john, jane\n', 'car, db9, m5\n', 'food, pizza, lasagne\n']
然后,我们用逗号将每一行分开:
In [43]: [line.replace(':',',',1).split(',') for line in open('filename.txt','r')]
Out[43]:
[['name', ' john', ' jane\n'],
['car', ' db9', ' m5\n'],
['food', ' pizza', ' lasagne\n']]
对于每一行中的每个元素,我们去除开始/结束空格,并将字符串大写为标题:
In [45]: [[elt.strip().title() for elt in line.replace(':',',',1).split(',')] for line in open('filename.txt','r')]
Out[45]: [['Name', 'John', 'Jane'], ['Car', 'Db9', 'M5'], ['Food', 'Pizza', 'Lasagne']]
现在,我们收集每个列表的第一个元素,然后收集第二个,依此类推:
In [47]: data=(zip(*([elt.strip().title() for elt in line.replace(':',',',1).split(',')] for line in open('filename.txt','r'))))
In [48]: data
Out[48]: [('Name', 'Car', 'Food'), ('John', 'Db9', 'Pizza'), ('Jane', 'M5', 'Lasagne')]
现在data [0]拥有字典的键。
In [49]: data[0]
Out[49]: ('Name', 'Car', 'Food')
data [1:]中的每个元组都是字典的值。
In [50]: data[1:]
Out[50]: [('John', 'Db9', 'Pizza'), ('Jane', 'M5', 'Lasagne')]
在这里,我们用值压缩键:
In [52]: [ zip(data[0],datum) for datum in data[1:]]
Out[52]:
[[('Name', 'John'), ('Car', 'Db9'), ('Food', 'Pizza')],
[('Name', 'Jane'), ('Car', 'M5'), ('Food', 'Lasagne')]]
最后,我们将其转换为字典列表:
In [54]: [dict(zip(data[0],datum)) for datum in data[1:]]
Out[54]:
[{'Car': 'Db9', 'Food': 'Pizza', 'Name': 'John'},
{'Car': 'M5', 'Food': 'Lasagne', 'Name': 'Jane'}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.