【问题标题】:merge common keys and its value individually in python dictionary在python字典中单独合并公共键及其值
【发布时间】:2022-01-11 16:21:13
【问题描述】:

我已经看到很多与我的问题相关的答案,但没有一个能解决我的问题

这是输入问题:

data = { "data": [{ key1:word},{ key1:hello},{key2:hey},{key2:hi}]}  

预期输出:

[{key1:word, key2:hey}, {key1:hello, key2:hi}]

如果我添加 key3 那么这是想要的输出:

data = { "data": [{ key1:word},{ key1:hello},{key2:hey},{key2:hi}, 
         {key3:somedata},{key3:somedata2}]}

# WANTED OUTPUT BELOW
 
[ {key1:word, key2:hey, key3:somedata}, {key1:hello, key2:hi, 
 key3:somedata2} ]

这是我尝试过的:

 for key,items in data.items():
    if key == "key1":
        do something
    if key == "key2":
        do something

但上面不能用于 1000 个密钥对值,所以代码应该是动态的。 将来可以添加key4,key5,key6....等,因此我无法在条件中定义每个关键项。

【问题讨论】:

  • data = { key1:value1},{ key1:hello},{key2:value2},{key2:value3} 不是正确的python...请分享您的实际代码。
  • @Cargo23,是的,它将被转换为元组!
  • 对不起,我现在更新了问题
  • 你能解释一下为什么他们像{key1:value1, key2:value2}, {key1:hello, key2:value3}这样匹配而不像{key1:value1, key2:value3}, {key1:hello, key2:value2}这样匹配吗
  • @RobinDillen 嗨,它不匹配它只是一个值不匹配!如果它令人困惑,我会改变。

标签: python arrays dataframe dictionary tuples


【解决方案1】:

只要所有键的数量相同,我就找到了一个巧妙的解决方案!

from itertools import groupby

data = [{"key1": "value1"}, {"key1": "hello"}, {"key2": "value2"}, {"key2": "value3"}, {"key3": "test1"},
        {"key3": "test2"}]

data.sort(key=lambda x: list(x.keys())[0]) # you need to sort for groupby to work in every case
grouped = [list(g) for k, g in groupby(data, key=lambda x: list(x.keys())[0])]
# = [[{'key1': 'value1'}, {'key1': 'hello'}], [{'key2': 'value2'}, {'key2': 'value3'}], [{'key3': 'test1'}, {'key3': 'test2'}]]
output = [{k:v for dic in t for k,v in dic.items()} for t in zip(*grouped)]
# source https://stackoverflow.com/a/43529214/10875953
print(output) 
# prints [{'key1': 'value1', 'key2': 'value2', 'key3': 'test1'}, {'key1': 'hello', 'key2': 'value3', 'key3': 'test2'}]

【讨论】:

  • 嗨罗宾,感谢您的回复。你能试试下面这样的预期输出吗 [{key1:word, key2:hey, key3:somedata}, {key1:hello, key2:hi, key3:somedata2}]
  • @Titanium 我编辑了我的答案
  • 哦刚才看到你编辑的回复,我想就是这样。它有效!
【解决方案2】:

有趣的请求.....我想这可能是你需要的?

data = [{ "key1":"value1"},{ "key1":"hello"},{"key2":"value2"},{"key2":"value3"}] 

odd_entries = data[::2]  # Iterate by twos, starting at 0
even_entries = data[1::2]  # Iterate by twos, starting at 1

print(list(zip(odd_entries, even_entries)))

[({'key1': 'value1'}, {'key1': 'hello'}), ({'key2': 'value2'}, {'key2': 'value3'})]

【讨论】:

  • 您好,key1 和 key2 应该在单个大括号中配对。并且代码应该是动态的如果你添加 {key3:"some data"} 那么输出应该是 {key1:word, key2:hey, key3:"some data"}, {key1:hello, key2:hi, key3:"一些数据"}
  • 如果有帮助,我已经更具体地更改了示例问题。
【解决方案3】:

希望这能帮助您理解问题

data = { "data": [{"key1":"word"},{ "key1":"hello"},{"key2":"hey"},{"key2":"hi"}, 
     {"key3":"somedata"},{"key3":"somedata2"}]}  

dic1 = {}
dic2 = {}

[dic2.update(dic) if tuple(dic)[0] in dic1.keys() else dic1.update(dic) for dic in data["data"]]

上面的列表理解可以重写为blow(为了更好的理解)

    for dic in data["data"]:
       if tuple(dic)[0] in dic1.keys():
           dic2.update(dic)
       else:
           dic1.update(dic)

输出:

dic1

{'key1': 'word', 'key2': 'hey', 'key3': 'somedata'}

dic2

{'key1': 'hello', 'key2': 'hi', 'key3': 'somedata2'}

【讨论】:

  • for i in range(len(data["data"])): 是正确的,尽管它是非pythonic。只需遍历data["data"]
  • 另外,如果你有 3 次“key1”,你的代码将无法工作,因为你只有 2 个字典
  • 是的,正如 Robin 指出的,第三次额外的 key1,key2,key3 会导致问题。
猜你喜欢
  • 1970-01-01
  • 2016-04-07
  • 2020-08-05
  • 2017-11-07
  • 1970-01-01
  • 2015-04-22
  • 2017-12-12
  • 1970-01-01
  • 2019-11-11
相关资源
最近更新 更多