【问题标题】:A more pythonic way of looping through multiple lists while modifying some of them在修改其中一些列表时循环多个列表的更 Pythonic 方式
【发布时间】:2023-03-21 06:56:01
【问题描述】:

我将尝试描述我的问题的核心: 我有一个信号列表,每个信号都有自己的别名,还有一个包含许多别名、值和值质量(质量可以是 0、1 或 2)条目的数据集。 我正在尝试遍历信号,在数据集中找到它的别名,并更新每个信号以给定质量写入多少次的计数器。 我已经建立了一个字典

dati = {'signals': [signal1, signal2, ...], 'alias': [alias1, alias2, ...], 'nGOOD': [0, 0, ...], 'nBAD': [0, 0, ...], 'nFREEZE': [0, 0, ...]}

我最终编写了这样的代码:

for i in range(0, len(dati['signals'])):

    #I extract the "quality" information using the alias
    quality = extracted using(dati['alias'][i])
    ######
    
    if quality == '0':
        dati['nGOOD'][i] += 1
    elif quality == '1':
        dati['nBAD'][i] += 1
    elif quality == '2':
        dati['nFREEZE'][i] += 1
    else:
        raise Exception('Qualità sconosciuta')

这段代码有效,但我知道使用索引并不是最符合 Python 的做法。我知道我可以使用 zip() 来遍历不同的列表,但是我得到了无法修改的元组。 有没有更好的方法来做到这一点?

感谢您的宝贵时间。

@Wups:代码的最终输出是信号名称和质量计数,所以我需要保持信息链接。

@Pranav Hosangadi:如果我理解正确,使用 enumerate 会更干净一些,但这仍然不是我所希望的。我仍然需要通过索引调用它们来修改质量。我曾希望有一种方法可以在循环期间访问它们。

【问题讨论】:

  • 您的代码中似乎没有使用信号列表中的值。如果这是正确的,您只需要遍历别名列表。
  • 这能回答你的问题吗? What does enumerate() mean?
  • 您需要zip()enumerate() 的组合。
  • 如果您使用字典列表而不是列表字典,事情会容易得多。

标签: python loops


【解决方案1】:

您可以使用enumerate() 来避免索引alias 列表。但是你仍然需要使用索引来增加值。

for i, alias in enumerate(dati['alias']):
    quality = extract quality from alias

    if quality == '0':
        dati['nGOOD'][i] += 1
    elif quality == '1':
        dati['nBAD'][i] += 1
    elif quality == '2':
        dati['nFREEZE'][i] += 1
    else:
        raise Exception('Qualità sconosciuta')

如果你有一个字典列表,事情会更容易。

dati = {
    {'signal': signal1, 'alias': alias1, 'nGOOD': 0, 'nBAD': 0, 'nFREEZE': 0},
    {'signal': signal2, 'alias': alias2, 'nGOOD': 0, 'nBAD': 0, 'nFREEZE': 0},
    ...
}
for datum in dati:
    quality = extract quality from datum['alias']
    if quality == '0':
        datum['nGOOD'] += 1
    elif quality == '1':
        datum['nBAD'] += 1
    elif quality == '2':
        datum['nFREEZE'] += 1
    else:
        raise Exception('Qualità sconosciuta')

通常,将相关属性放在一起比为每个属性单独设置一个数组更简单。

【讨论】:

  • 这可行。我将数据放在单独的数组中,因为它在我构建它们时很有用,但没有什么能阻止我切换它的格式。我不知道我是否可以轻松地在列表字典和字典列表之间切换,但它基本上可以对列表列表执行相同的操作并使用 dati= list(zip( *数据))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2021-11-13
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 2018-07-09
  • 2017-08-17
相关资源
最近更新 更多