【问题标题】:Convert list of Dictionaries with same keys into a single list [duplicate]将具有相同键的字典列表转换为单个列表[重复]
【发布时间】:2018-02-10 19:03:39
【问题描述】:

我有一个字典列表:

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]

致那些将此问题标记为重复的人。我刚刚发现我的查询与我的type(output) #str 不同,而不是 int 或 float 这就是为什么当我写 AttributeError 时没有人指出为什么 dict 的浮点值是 str 类型。这就是我没有让它工作的原因。

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

【问题讨论】:

  • 上面的代码不会产生您声称的错误。

标签: python python-2.7 dictionary


【解决方案1】:

您可以遍历 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]

【讨论】:

  • 这对我有用,我得到了预期的输出
【解决方案2】:

这样做

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

【讨论】:

  • 是的。它不会。我已经试过了
【解决方案3】:

试试这个解决方案。

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

【讨论】:

  • 是的。它不会。我已经试过了
  • @RaghavPatnecha “它不会”是什么意思?此解决方案有效
  • @vaultah 你在说什么清单不是清单,清单是清单,还是说我不是我自己,你不是你自己,我们不是彼此?
  • @vaultah 我没有足够的睡眠来回答这个问题
【解决方案4】:

您可以通过以下代码实现此目的

d=[]
for k in output:
   d.append(k['latitude'])

【讨论】:

    【解决方案5】:

    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'] 即可获得纬度列表。 (如果您有类似的数据集,也同样适用于经度。)

    【讨论】:

      【解决方案6】:

      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)
      

      【讨论】:

        猜你喜欢
        • 2017-12-11
        • 2020-04-12
        • 2015-04-03
        • 1970-01-01
        • 2022-10-30
        • 1970-01-01
        • 2022-01-19
        • 2019-05-05
        • 2019-11-18
        相关资源
        最近更新 更多