【问题标题】:update dict value from one to another based on condition python根据条件python将dict值从一个更新到另一个
【发布时间】:2018-11-23 16:09:04
【问题描述】:

有没有更好的方法来编写以下代码?我有两个具有相同数据集的字典作为键,我想迭代 dict_a 并检查是否有任何键只有一个值,然后将值更新为 dict_b。我有以下工作代码,但似乎应该有更好的方法来做到这一点

dict_a = {
'first': {1,2},
'second': {2, 7, 10, 22},
'third': {3},
'fourth': {6,8},
'fifth': {1},
}
dict_b = {
'first': 11,
'second': 4,
'third': 1,
'fourth': 1000,
'fifth': 8
}
for k, v in dict_a.items():
    if len(v) == 1:
        dict_b[k] = v.pop()
#=>  
#dict_b = {
#'first': 11,
#'second': 4,
#'third': 3,
#'fourth': 1000,
#'fifth': 1
#}

【问题讨论】:

  • 这也会修改dict_a 中的值。这就是你想要的吗?
  • 是的,我其实并不关心 dict_a

标签: python python-3.x dictionary set


【解决方案1】:

您可以使用update 和生成器将其设为单线:

dict_b.update((k, v.pop()) for k, v in dict_a.items() if len(v) == 1)

从算法上讲,这不会带来任何好处,但会利用所使用的句法手段带来的一些优化。

【讨论】:

    【解决方案2】:

    当您在set 中的set 值上使用pop 时,您可能会不必要地修改dict_a。相反,您可以使用 next + iter 提取 set 的唯一值:

    dict_b[k] = next(iter(v))
    

    【讨论】:

    • 这似乎不会导致 OP 想要什么,而是从每个集合中提取第一个元素。我错过了什么吗?
    • 我想是这样.. 如果集合的长度为 1,即未更改的 if 子句,那么从每个集合中提取唯一(碰巧是“第一个”)元素正是v.pop 实现。
    • 啊,我忘了把这个放在现有的条件中。我的错。巧妙的实现。
    • @JonahBishop 此外,集合本质上是无序的。第一个和最后一个没有意义。两种方法都检索 any 元素。
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2023-02-22
    相关资源
    最近更新 更多