0

我有一个嵌套列表,其中包含一个整数作为每个列表的最后一个元素,我试图查看列表中的下一个项目是否比当前项目多一个,即当前列表的最后一个元素是否为 104,如果下一个列表的最后一个元素是 105,则执行一些操作。

data=[[a,b,c,1200],[a,g,x,3401],[f,a,c,3402],[f,a,c,3403]etc]
for item in data:
    if next(item[-1])==item[-1]+1: #if next item is this item plus one
        #do something

这一直在上升TypeError: Can't convert 'int' object to str implicitly,我不知道为什么。有没有办法使用加法来比较我不知道的python中的列表元素?

(下一个(项目)部分可能不准确,因为我使用一个函数来获取完整代码中的上一个和下一个项目,而不是下一个(),但原则上是相同的)

4

3 回答 3

2

您的错误消息是由于您使用item[1]了您似乎打算的地方item[-1]。但是,修复此问题不会修复您的代码 -next(item[-1])没有意义。我建议使用以下方法重构此循环itertools.groupby()

from itertools import groupby, count
c = count()
for key, group in groupby(data, lambda x: x[-1] - next(c)):
    for item in group:
        # whatever

这将data在子列表的最后一个元素中划分为连续运行的整数组。每个内部循环将在一个单独的连续运行中运行,如果需要,您可以在此内部循环之前添加设置代码。

于 2012-08-03T11:47:45.553 回答
1

这将做你想要的。

data=[[a,b,c,1200],[a,g,x,3401],[f,a,c,3402],[f,a,c,3403]etc]
previous = 0 # adjust if necessary
for item in data:
    if item[-1] == previous + 1:
        #do something
    previous = item[-1]

next(item[-1])不按你的想法做。您可以通过应用一些推理自行推断:

  1. next(),没有收到您想要的“下一个”元素的实际前体,那就是item
  2. 如果您要通过itemnext()则必须弄清楚列表item是其中的一部分。
  3. 如果item在多个列表中怎么办?如果它在同一个列表中出现多次怎么办?要退回哪个项目?

正如你所看到的,没有办法通过简单地传递一些恰好是某个列表的一部分的随机对象来获取列表中的下一个项目。

实际做next()的是完全不同的。它为您提供了从迭代器/生成器生成的下一个项目。

于 2012-08-03T11:58:38.283 回答
0

您需要正确转换类型。

if int(next(item[-1])) == int(item[1]) + 1:

另外,我不明白你为什么不这样做

 if int(item[0]) == int(item[1]) + 1:

ValueError如果转换失败,请准备好捕获 a 。

于 2012-08-03T11:46:21.847 回答