【问题标题】:Iterating Python Array迭代 Python 数组
【发布时间】:2015-08-05 16:36:16
【问题描述】:

我在下面的代码中有一个逻辑错误:

while count < 5:
    row = next(csv_f)
    if row[0] != currentID:
        userArray.append(Users(row[0]))
        currentID = row[0]
        count = count+1

    userArray[len(userArray)-1].addUsageData(row[1],row[3])

循环遍历每个用户,直到 ID 发生变化,总共执行五次。

一切正常,但我从 row[1] 获得的使用数组中的最后一个索引始终是下一个 userID 块中的第一个。就好像执行 if 块时 len(userArray) 没有更新。

【问题讨论】:

  • 尝试在前后打印 len(userArray)。努力实际调试,
  • 从您发布的代码中,问题的根源并不明显。你能准备一个可运行的例子来演示这个问题吗?
  • @flyinghigh 如果您将元素添加到列表中 - 长度会增加。你说它不是,因为你附加了 if。我非常怀疑您遇到了 Python 错误。在每行后面加上有意义的信息的打印语句我很确定你会在 5 分钟内通过这种方式解决问题。
  • Python 错误还是我的错误?
  • 所以数组的一个索引有276行,长度是正确的。但是,最后,当添加新索引时,它仍然显示长度为 1! 274 这是 len 1 275 这是 len 1 276 这是 len 1 1 这是 len 2

标签: python loops logic


【解决方案1】:

row[0] != currentID 最后一次时,count 递增到 5。这 立即让您脱离while-loop之前 任何后续行 在csv_f 被处理。如果addUsageData正在累积数据,这就是为什么最终的user只有一行数据。

您可以使用itertools.groupbyitertools.islice 解决此问题:

import itertools as IT
import operator

userArray = []
for currentID, grp in IT.islice(IT.groupby(csv_f, key=operator.itemgetter(0)), 5):
    user = Users(currentID)
    userArray.append(user)
    for row in grp:
        user.addUsageData(row[1], row[3])

【讨论】:

  • 但他在问题中有不同的缩进。
  • @Andrey:OP 说他相信他的代码中存在逻辑错误。我认为逻辑错误是由于不正确的缩进造成的。
  • 是的,这就是我最初的想法,但这并不完全符合他对问题的描述。无论如何对问题的描述都很模糊。
  • 在 csv 中有相同 userId 的列。所以我只想在 ID 更改时创建一个新的 User 对象。但我确实希望为循环的每次迭代添加数据。它只是将新 id 的第一个附加到旧 id 的最后一个。
猜你喜欢
  • 2020-03-29
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2018-07-16
  • 2015-04-04
  • 2019-01-25
相关资源
最近更新 更多