【问题标题】:python iterate through an array and access the same value in a dictionarypython遍历数组并访问字典中的相同值
【发布时间】:2018-01-15 13:23:00
【问题描述】:

我有一本由数字及其值组成的字典

dict = {1:5, 2:5, 3:5}

我有一个包含一些数字的数组

arr = [1,2]

我想做的是:

遍历字典和数组 其中字典值等于数组中的数字,将字典值设置为零 字典中的任何值,如果数组中没有与之匹配的值,则添加 1

所以在上面的例子中,我应该以

结尾
arr = [1,2]
dict = {1:0, 2:0, 3:6}

我遇到的问题是从数组值创建一个变量并访问字典中的特定数字 - 例如使用 dict[i]

【问题讨论】:

  • 尽量不要覆盖诸如dict之类的内置名称。迟早你会调试为什么你会得到一些有趣的东西,比如TypeError: 'list' object is not callable 或类似的东西。

标签: python arrays loops dictionary


【解决方案1】:
arr = [1,2]
data = {1:0, 2:0, 3:6}  # don't call it dict because it shadow build-in class

unique = set(arr)  # speed up search in case if arr is big
# readable
for k, v in data.items():
  if k in unique:
    data[k] = 0
  else:
    data[k] += 1
# oneliner
data = {k: (0 if k in unique else v + 1) for v, k in data.items()}

补充例子:

for a, b, c in [(1,2,3), (4,5,6)]:
  print('-',a,b,c)
# will print:
# - 1 2 3
# - 4 5 6

【讨论】:

  • “for k, v in data”——这是一种特殊的 for 循环吗?它有名字吗(也请阅读更多)?
  • dict.items() 返回生成器,该生成器将键和值生成为元组 docs。您也可以通过这种方式遍历简单的元组列表,我会将其添加到答案中
【解决方案2】:

您只需要一个dict-comprehension,它将使用if 值部分的条件重新构建您的字典。

my_dict = {1:5, 2:5, 3:5}

arr = [1,2]

my_dict = {k: (0 if k in arr else v+1) for k, v in my_dict.items()}
print(my_dict)  # {1: 0, 2: 0, 3: 6}

请注意,我已将字典从 dict 重命名为 my_dict。这是因为通过使用dict,您正在覆盖名为dict 的Python 内置函数。而你不想这样做。

【讨论】:

  • 提示:如果arr 开始变大,为了进行简单而有效的优化,请将其改为set
【解决方案3】:

他们始终采用dict(map()) 方法,该方法使用每个键的新值重建一个新字典:

>>> d = {1:5, 2:5, 3:5}
>>> arr = {1, 2}
>>> dict(map(lambda x: (x[0], 0) if x[0] in arr else (x[0], x[1]+1), d.items()))
{1: 0, 2: 0, 3: 6}

这是因为包装 dict() 会自动将映射的 2 元组转换为字典。

另外你不应该使用dict 作为变量名,因为它会影响内置的dict

【讨论】:

    【解决方案4】:

    只需使用 .update 方法:

    dict_1 = {1:5, 2:5, 3:5}
    arr = [1,2]
    
    
    for i in dict_1:
        if i in arr:
            dict_1.update({i:0})
        else:
            dict_1.update({i:dict_1.get(i)+1})
    
    print(dict_1)
    

    输出:

    {1: 0, 2: 0, 3: 6}
    

    P.S : 不要使用 dict 作为变量

    【讨论】:

      猜你喜欢
      • 2014-11-19
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2015-07-22
      • 1970-01-01
      相关资源
      最近更新 更多