【问题标题】:How to set a dynamic range in a for loop (avoid index out of range when removing an item during the loop)?如何在 for 循环中设置动态范围(避免在循环期间删除项目时索引超出范围)?
【发布时间】:2019-12-28 13:51:51
【问题描述】:

我有一个包含许多数据框的字典 我试图通过查找在其内容中匹配的键并连接这样的键来连接和减少我的字典,在每次连接之后我想删除字典中的一个键。 假设每个键都以创建数据框的那一天命名,我想连接 2018 年的所有列表... 问题是我得到 IndexError: list index out of range (我猜在删除一个键后,因为 for 循环的范围保持不变) 我想做的是,每次删除后,范围都会被调整-1,所以我不会遇到这个问题。 有任何想法吗?

for i in range(len(dict)-2):
        for j in range(1,(len(dict)-1)):
           if (list(dict.keys())[i][4:12] ==list(dict.keys())[j][4:12]):
               dict[list(dict.keys())[i]] = pd.concat([dict[list(dict.keys()[i]],dict[list(dict.keys()[j]],sort= False)
del dict[list(dict.keys())[j]

IndexError: list index out of range

【问题讨论】:

  • 使用while循环如:while i < len(dict) - 2:并在循环中增加i

标签: python pandas list concat


【解决方案1】:

由于列表中的元素在您删除它们前面的任何内容后都会向左移动,因此您可以从后面循环遍历列表。 这是一个简单的示例,它比您的代码更容易理解:

>>> l = [1, 2, 3, 4, 5, 6]
>>> for i in range(len(l)):
    real_i = len(l)-i-1
    if l[real_i] % 2 == 0:
        del l[real_i]


>>> l
[1, 3, 5]

在这里,我从列表中删除每个可以除以 2 的元素。由于我使用 real_i = len(l)-i-1 从最后一个开始计算索引,因此我是否从列表中删除元素并不重要。

【讨论】:

    猜你喜欢
    • 2019-04-17
    • 2017-08-09
    • 2018-12-07
    • 2013-11-25
    • 1970-01-01
    • 2011-09-07
    • 2022-06-13
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多