【问题标题】:Appending to dictionaries while altering values in python在python中更改值时附加到字典
【发布时间】:2020-04-12 15:07:53
【问题描述】:

我有一本d1={"url1":0, "url2":1, ...} 类型的字典。然后我有两个相同格式的字典,包含不同的 URL,但值仍然从 0 开始。有没有办法组合字典,以便数字自动更改,并且我有一个没有重复值的字典(即每个 URL 在添加后都有一个唯一的编号)。我尝试了.update(),但我认为它不适合我的目的。

在添加更清晰的示例方面,代码如下所示:

d1 = {"url1":0, "url2":1}
d2 = {"url3":0, "url4":1}
d3 = {"url5":0, "url6":1}

我想要一个将这些字典结合起来并给我的函数:

d4 = {"url1":0, "url2":1, "url3":2, "url4":3, "url5":4, "url6":5}

我尝试了d1.update(d2),然后尝试了d1.update(d3),但这些似乎都不起作用。

【问题讨论】:

  • 你试过用python combine dictionaries搜索吗?
  • 是的,我没有看到这种情况。如果你知道一个线程,请链接它。
  • 无法从您的解释中看出您要做什么。您应该包含要组合的字典的最少示例以及您期望的结果以及您尝试的不起作用的代码。请阅读minimal reproducible example
  • 我更新了问题以使其更清晰

标签: python dictionary indexing


【解决方案1】:

试试这个:

def append_di(d_to, d_from):
    start = len(d_to)
    for k in d_from:
        if k not in d_to: 
           d_to[k] = start
           start += 1

di = {"url1":0, "url2":1}
di_2 = {"url3":0, "url4":1, "url1":2}
append_di(di, di_2)
print(di)

输出:

{'url1': 0, 'url2': 1, 'url3': 2, 'url4': 3}

使用dict comprehension

di = {"url1":0, "url2":1}
di_2 = {"url3":0, "url4":1, "url1":3}
di.update({k:(len(di) + i) for i,k in enumerate(di_2) if k not in di})
print(di)

【讨论】:

  • 感谢您的回答,这似乎有效,尽管我不确定它的效率如何。另外,如果字典中有重复的键,此方法是否有效。
  • 那是不同的故事,你也应该添加你的代码,以便我们讨论效率,但这个问题只是关于逻辑实现。
  • 好的,所以这些不适用于重复项(即,如果原始字典中已存在键,则保留旧值,仅在新值时添加)
  • 希望已经解决了您的问题。如果它不起作用,请告诉我!
【解决方案2】:

我不确定我是否清楚您正在寻找的功能的细微差别,但这可能适合您的需求:

dicts = [d1,d2,d3]
keys = [k for d in dicts for k in d.keys()]
d4 = dict(zip(keys, range(len(keys))))

请注意,它不会对密钥进行排序。此外,如果存在冗余密钥,则提供的第一个密钥将被后面的密钥覆盖。这将导致索引方案出现空白。

此解决方案相当简单,但如果您想要更高程度的控制,我建议使用 @abhiarora 建议的循环。

【讨论】:

  • 这对我不起作用,它只是结合字典而不更新问题中我想要的值。
  • @RohanBansal 我知道我误解了您要执行的操作。哪个 url 获取哪个索引重要吗,即url1:0url2:1 等?还是每个网址都有一个唯一的索引才重要?如果存在冲突的键,您是否还希望覆盖现有条目?
  • 不,只要每个索引都有唯一的索引就可以了。另外,我希望现有值不会被覆盖,而是保留为原始值。
【解决方案3】:

假设您使用的 Python 版本维护 dicts 的插入顺序,并且您只希望值从零开始并为每个键增加一:

d1 = {"url1":0, "url2":1}
d2 = {"url3":0, "url4":1}
d3 = {"url5":0, "url6":1, 'url1':2}

new = dict.fromkeys(k for d in [d1,d2,d3] for k in d.keys())
for i,k in enumerate(new):
    new[k] = i

k for d in [d1,d2,d3] for k in d.keys() 扁平化每个字典中的键的序列
使用fromkeys() 构造一个新字典可以消除重复。


>>> new
{'url1': 0, 'url2': 1, 'url3': 2, 'url4': 3, 'url5': 4, 'url6': 5}
>>> 

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 2021-12-21
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2013-07-12
    相关资源
    最近更新 更多