将具有相同键的字典列表转换为单个列表

时间:2018-02-10 19:03:39

标签: python python-2.7 dictionary

我有一个dict列表:

select distinct email from tablename

因为密钥完全相同所以我想合并它并从字典中创建一个列表。 到目前为止,我已经尝试过这个:

output = [{"latitude": 28.6333}, {"latitude": 28.6333}, {"latitude": 28.65}]

但我给了我一个错误d = [] for k in output.iterkeys(): d[k] = list(d[k] for d in output) print d 我在这里做错了什么。

预期产出:

AttributeError: 'str' object has no attribute 'iterkeys'

对于将此问题标记为重复的人。我刚刚发现我的查询与我的[28.6333, 28.6333, 28.65] 不同而不是int或float这就是为什么当我写AttributeError时没有人指出为什么dict是float值的类型是str。这就是我没有让它发挥作用的原因。

当我将所有单独的答案作为一个单独的程序运行时,我得到了我想要的东西,但这肯定不符合我的程序的要求

6 个答案:

答案 0 :(得分:2)

这样做

[x["latitude"] for x in output] 

答案 1 :(得分:2)

试试这个解决方案。

d = [ k["latitude"] for k in output]

答案 2 :(得分:2)

您可以迭代dicts列表,并获取值,使它们成为迭代器(iter)以使用next获取唯一值:

[next(iter(d.values())) for d in output]

同样,使用map

[*map(lambda d: next(iter(d.values())), output)]

我选择了这种方法而不是明显的[k["latitude"] for k in output],因为这可以通用的方式工作,即不必知道获取值列表的键的名称。

示例:

In [85]: output
Out[85]: [{'latitude': 28.6333}, {'latitude': 28.6333}, {'latitude': 28.65}]

In [86]: [next(iter(d.values())) for d in output]
Out[86]: [28.6333, 28.6333, 28.65]

In [87]: [*map(lambda d: next(iter(d.values())), output)]
Out[87]: [28.6333, 28.6333, 28.65]

答案 3 :(得分:1)

output变量是一个列表,但请尝试以下操作:

# I assume Python 2.7
output = [{"latitude": 28.6333}, {"latitude": 28.6333}, {"latitude": 28.65}]


d = {}
for dic in output:
    for k,v in dic.iteritems():
        if k in d:
            d[k].append(v)
        else:
            d[k] = [v]
print d

这将与原始字典中的多个键一起使用,并将所有键的一个字典作为所有相应值的列表。

可以使用defaultdict(list)进行改进,以便可以将其重写为:

from collections import defaultdict

d = defaultdict(list)
for dic in output:
    for k,v in dic.iteritems():
        d[k].append(v)
print d

以上两者都将输出:

d = {"latitude": [28.6333, 28.6333, 28.65]}

因此,要获取每个键的列表,然后只需查找d ['latitude']并获得纬度列表。 (如果您有类似的数据集,也可以用于经度。)

答案 4 :(得分:1)

您可以通过以下代码

来实现此目的
d=[]
for k in output:
   d.append(k['latitude'])

答案 5 :(得分:0)

output不是字典,因此iterkeys()不适用。

以下代码应该可以解决问题(使用Python 3.6.1):

import collections

output = [{"latitude": 28.6333}, {"latitude": 28.6333}, {"latitude": 28.65}]

dic = collections.defaultdict(list)

for d in output:
    for k, v in d.items():
        dic[k].append(v)
print (dic)