在Python中创建一个字典列表

4

我有一个数据集是从一个文本文件中读取的:

all_examples=   ['A,1,1', 'B,2,1', 'C,4,4', 'D,4,5']

我需要创建一个字典列表,如下所示:
lst = [ 
{"A":1, "B":2, "C":4, "D":4 },
{"A":1, "B":1, "C":4, "D":5 } 
]

我尝试使用生成器函数,但很难创建这样的列表。

attributes = 'A,B,C'
def get_examples():

    for value in examples:
        yield dict(zip(attributes, value.strip().replace(" ", "").split(',')))

你所期望的输出字典是不正确的。请编辑你的帖子。 - Joe T. Boka
2
为什么不将一个单一的键点指向包含映射值的列表呢? - Chuck
2
你可以有一个包含字典的列表,但你不能有一个只包含列表的字典。你需要在字典中使用键值对。此外,你的输入严格是一个字符串列表。因此,首先使用 split 将其转换为一个列表的列表,然后进行查找。 - roadrunner66
我认为你把[]和{}搞混了。http://learnpythonthehardway.org/book/ex39.html - JustGage
4个回答

7

一句简短的话,只是为了好玩:

all_examples = ['A,1,1', 'B,2,1', 'C,4,4', 'D,4,5']

map(dict, zip(*[[(s[0], int(x)) for x in s.split(',')[1:]] for s in all_examples]))

生成:

[{'A': 1, 'C': 4, 'B': 2, 'D': 4}, 
 {'A': 1, 'C': 4, 'B': 1, 'D': 5}]

作为额外福利,这也适用于更长的序列:
all_examples = ['A,1,1,1', 'B,2,1,2', 'C,4,4,3', 'D,4,5,6']

输出:

[{'A': 1, 'C': 4, 'B': 2, 'D': 4},
 {'A': 1, 'C': 4, 'B': 1, 'D': 5},
 {'A': 1, 'C': 3, 'B': 2, 'D': 6}]

解释:

map(dict, zip(*[[(s[0], int(x)) for x in s.split(',')[1:]] for s in all_examples]))
  • [... for s in all_examples] 针对列表中的每个元素:
  • s.split(',')[1:] 通过逗号拆分它,然后取第一个元素之后的每个元素
  • (...) for x in 并将其转换为元组列表
  • s[0], int(x) 将第一个字母与该元素转换为整数的元素配对
  • zip(*[...]) 现在转置您的元组列表
  • map(dict, ...) 并将每个元组列表转换为字典!

很棒的解决方案,但有没有办法创建一个有序字典?这里的结果是无序的。 - Clint Whaley
2
Python中的常规字典总是无序的;如果您想要一个有序的字典,只需添加from collections import OrderedDict并使用它来代替dict即可。 - tzaman

3

也只是为了好玩,但重点在于易懂:

all_examples = ['A,1,1', 'B,2,1', 'C,4,4', 'D,4,5']
ll = [ x.split(",") for x in all_examples ]
ld = list()
for col in range(1, len(ll[0])):
    ld.append({ l[0] : int(l[col]) for l in ll })
print ld

将打印

[{'A': 1, 'C': 4, 'B': 2, 'D': 4}, {'A': 1, 'C': 4, 'B': 1, 'D': 5}]

只要输入是由整数组成的csv文件,且每行长度相同,程序就能正常工作。
解析:我将使用术语“物品”来代表A、B和C,用“测量值”来代表数据中的“列”,即在输入数据的同一“csv列”中的那些值。
将字符串输入数据转换成每行一个列表: A,1,1 -> ["A","1","1"]
ll = [ x.split(",") for x in all_examples ]

结果应该是一个字典列表,让我们先初始化一个:
ld = list()

对于每个测量值(假设所有行都具有相同的列数):

for col in range(1, len(ll[0])):

从该行中获取l[0],例如"A",并将相应列l[col](例如"1")的测量值转换为数字值int(),然后将其分配给该项。然后使用字典推导式将其合并到所需结果的下一行。最后,将dict附加到结果列表ld中。

    ld.append({ l[0] : int(l[col]) for l in ll })

查看未格式化的内容。使用print json.dumps(ld, indent=4)以获取更方便的显示:

print ld

希望这能帮到你。在字典理解方面可以找到更多相关内容,例如这里(这本伟大书籍的Python3版本)。

你能稍微解释一下这个吗? - Clint Whaley

1
你实际上有一个字符串列表,想要从每个字符串的元组三元组中生成一对字典列表,这些字典具有相同的键。
为了保持简单,我将使用for循环而不是复杂的字典推导结构。
my_dictionary_list = list()
d1 = dict()
d2 = dict()
for triplet_str in all_examples:
    key, val1, val2 = triplet_str.split(',')
    d1[key] = val1
    d2[key] = val2
my_dictionary_list.append(d1)
my_dictionary_list.append(d2)

>>> my_dictionary_list
my_dictionary_list
[{'A': '1', 'B': '2', 'C': '4', 'D': '4'},
 {'A': '1', 'B': '1', 'C': '4', 'D': '5'}]

1
你的问题应该是“如何创建字典列表?”。以下是您需要考虑的一些内容。
>>> dict={}
>>> dict2={}
>>> new_list = []
>>> all_examples=['A,1,1', 'B,2,1', 'C,4,4', 'D,4,5']
>>> for k in all_examples:
...     ele=k.split(",")
...     dict[str(ele[0])]=ele[1]
...     dict[str(ele[0])]=ele[2]
...     new_list.append(dict)
...     new_list.append(dict2)
>>> dict
{'A': '1', 'C': '4', 'B': '2', 'D': '4'}
>>> dict2
{'A': '1', 'C': '4', 'B': '1', 'D': '5'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接