【问题标题】:Python for loop with ifs带有 ifs 的 Python for 循环
【发布时间】:2019-01-30 08:00:00
【问题描述】:

我有什么:

我在字典中有两个键:

  • 一个有值和
  • 一个与值的索引。

    d = {}
    d['inds'] = [0, 5, 4, 2, 2, 5, 1]
    d['vals'] = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
    

我想做什么:

我想遍历字典并且:

  • 如果下一次迭代索引=上一次迭代索引+1,则列出对应的值
  • 如果下一次迭代索引不 = 上一次迭代索引 +1,则打印 0 并继续。所以基本上只是在缺少索引时填写 0

我尝试过的

如果我使用以下循环:

for i in d['inds']:
    for v in d['vals']:
        for x in range(0, i):
         if i == x+1:
             print(v)
             break
    else:
         print(0)

我得到了 6 次值列表。

所以我尝试交换 i 和 x:

for i in d['inds']:
    for v in d['vals']:
        for x in range(0, i):
         if x == i+1:
             print(v)
             break
    else:
         print(0)

现在我只列出了 7 次 0。

TL;DR

如何使用条件语句遍历字典的值和索引,我做错了什么?

【问题讨论】:

  • 我只看到一本字典,d。另一个是什么?
  • DYZ 是对的,您的字典中有两个“键”,但您只显示一个字典。
  • 对不起,是的,只有一本字典,但有两个键!
  • 你能再试着问你的问题吗?我还不明白你想做什么。
  • 有两个键。希望从键创建一个向量,当下一个数字索引丢失时填充零值。希望得到 1.0、7.0、4.0、5.0、0.0、3.0、2.0、6.0 的最终结果,因为 0 的值为 1,1 的值为 7,2s 的值为 4 和 5,缺少 3,所以 0、4s 的值为 3 , 5s 值为 2 和 6

标签: python-3.x dictionary for-loop if-statement


【解决方案1】:

如果我理解正确,你想要这样的东西:

for i in range(len(d['inds'])):
    if i in d['inds']:
        print(d['vals'][i])
    else:
        print(0)

这会遍历所有可能的索引,如果当前索引不在 d['inds'] 中,则打印 0,如果在,则打印当前索引处的值。

【讨论】:

  • 那种。绝对比我所拥有的更接近。但希望最终结果是:1.0, 7.0, 4.0, 5.0, 0.0, 3.0, 2.0, 6.0 因为 0 的值是 1,1 的值是 7,2s 的值是 4 和 5,缺少 3 所以 0、4s 的值是3、5s的值为2和6
【解决方案2】:

此解决方案需要函数chaindefaultdict

from itertools import chain
from collections import defaultdict

创建一个新的列表字典:

G = defaultdict(list)

用来自d的数据填充它:

for k,v in zip(d['inds'], d['vals']):
    G[k].append(v)
#{0: [1.0], 5: [2.0, 6.0], 4: [3.0], 2: [4.0, 5.0], 1: [7.0]}

创建一系列索引:

indexes = range(min(d['inds']), max(d['inds']) + 1)

在新字典中查找每个索引。如果字典中没有索引,则使用[0] 作为值。结果是一个可以用chain 展平的嵌套列表:

list(chain.from_iterable(G.get(x, [0]) for x in indexes))
#[1.0, 7.0, 4.0, 5.0, 0, 3.0, 2.0, 6.0]

【讨论】:

  • 那么 get(x,[0]) 从索引 x 获取值并在找不到 x 时置零?
  • 正确。它可以被替换为d[x] if x in d else []
猜你喜欢
  • 2021-08-21
  • 2014-10-27
  • 2013-01-25
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多