【问题标题】:How to append and item to the last appended item in a list with a for loop如何使用for循环将和项目附加到列表中的最后一个附加项目
【发布时间】:2020-07-30 03:17:51
【问题描述】:

我有一个 for 循环遍历 CSV 中的每一行,我创建了一个包含列表的字典,但该列表被覆盖,因为字典键重复了多次。如何在下一次循环迭代中总结或附加到第二(1)位置的列表中相同键的下一个值?

因为如果再次找到现有键,则附加值会被覆盖,因此键的值会被一遍又一遍地覆盖。

with open('RawPolicy.csv', newline='') as rulemaker:
    rmatcher = csv.reader(rulemaker, delimiter=" ")

    for i in rmatcher:
        dic[i[2]]=[i[0]],[i[1]]

CSV 中的字段是:

Sgrupo3 CSGrupo3 LLLLLLLL
Sgrupo4 CSGrupo4 LLLLLLLL

输出应该是这样的:

{'LLLLLLLL': (['Sgrupo3', 'Sgrupo4'], ['CSGrupo3', 'CSGrupo4'])}

【问题讨论】:

  • 请使用示例输入和预期输出更新您的问题,您当前的描述和代码不清楚。
  • 现在应该更清楚了。

标签: python-3.x list dictionary for-loop csvreader


【解决方案1】:

您可以使用dict.setdefault 使用 2 个子列表的元组来初始化每个新键,然后通过压缩子列表和当前记录中的值来迭代它们以附加到每个列表中对应的价值:

for *values, key in rmatcher:
    for lst, value in zip(dic.setdefault(key, ([], [])), values):
        lst.append(value)

演示:https://repl.it/@blhsing/GratefulMountainousProperty

如果您的值和键不一定在前三列,您可以直接指定索引。以下代码假定索引 6 处的键和索引 0 和 1 处的值:

for row in rmatcher:
    for lst, value in zip(dic.setdefault(row[6], ([], [])), row[:2]):
        lst.append(value)

【讨论】:

  • 上面的例子效果很好,但我这样做是为了让我可以更清楚地理解论坛,但实际上我需要多 3 个列,总共 5 个做同样的操作,不知道那个函数,所以我不知道如何使用两个以上的列。
  • 成功了,非常感谢您的帮助。
猜你喜欢
  • 2023-01-07
  • 2020-06-13
  • 2020-03-29
  • 1970-01-01
  • 2016-01-23
  • 2019-05-15
  • 2013-12-24
  • 2019-07-05
相关资源
最近更新 更多