迭代python中的两个列表列表

时间:2015-09-12 04:21:09

标签: python list

我是python编程的新手,并且很难遍历两个列表列表。我的两个列表的格式如下:

@JsonProperty("EventId")
private long eventId;
@JsonProperty("Name")
private String name;

每个列表中的两个数字是起点和终点坐标,我想查看比较两个列表时起点和终点坐标之间是否有任何重叠,然后将信息保存到新列表中。程序运行后我想要的列表将输出:

var obj = {a: 1, b: 2, c: 3, d: 4, e: 5 };

['c', 'e'].forEach(e => delete obj[e]);

// obj is now {a:1, b:2, d:4}

到目前为止,我的代码是

L = [['cat', '1', '5'], ['cat', '7', '15'],['cat', '17', '20']]
A = [['coordOne', '1', '3'],['coordTwo', '8', '9'],['coordThree', '11', '13'],['coordFour', '18', '21']]

我收到'int'对象不可调用的错误。

5 个答案:

答案 0 :(得分:2)

您可以使用" zip"功能。

L = [['cat', '1', '5'], ['cat', '7', '15'],['cat', '17', '20']]
A = [['coordOne', '1', '3'],['coordTwo', '8', '9'],['coordThree', '11', '13'],['coordFour', '18', '21']]
newList = []

for (i,j) in zip(L, A):
    if i[1] >= j[1] and i[1] <= j[2] or i[2] >= j[1] and i[2] <= j[2] or i[1] <= j[1] and i[2] >= j[2] and j[2] >= i[2] or i[1] <= j[1] and i[2] >= j[2]:
        newList.append( (i[0], j[0]) )

答案 1 :(得分:1)

我收到了一个不同的错误:IndexError: list index out of range。这是因为这个测试发生的:

if [i][1] >= [j][1] 

[i]是一个仅包含i的列表,然后您尝试访问不存在的索引1(它只有一个元素,它位于索引0)。您还拥有仅i[1]j[1]的内容,这些内容会因“int对象无法下标”而中断。你似乎的意思是:

if L[i][j] >= A[j][1] 

解决所有这些问题会产生另一个错误:

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    newList.append(L[i][0], A[j][0])
TypeError: append() takes exactly one argument (2 given)

您可以通过在该调用周围添加一组额外的括号来修复(添加L[i][0]A[j][0]元组)。这给出了您期望的输出类型:

[('cat', 'coordOne'), ('cat', 'coordThree'), ('cat', 'coordFour'), ('cat', 'coordOne'), ('cat', 'coordOne'), ('cat', 'coordFour')]

但还有更好的方法。首先,像这样迭代:

for i in range(len(L)):

几乎总是一种反模式。您只能使用ij来索引这两个列表;只是做:

for l in L:

(但选择更好的变量名称 - 通常将列表命名为复数,如thingsfor thing in things:)。

您有两个嵌套循环来考虑L的每个元素对A的每个元素。这称为笛卡儿产品,执行此操作的惯用方法是使用itertools

import itertools as it

for l, a in it.product(L, A):
    if l[1] >= a[1] ... :

您可能还想考虑使用namedtuple,以便为每个列表中的内容指定名称,以便您可以测试if l.start >= a.start:之类的内容。这样可以更容易地推断出您的代码正在做什么,这样您就可以正确地处理您的情况。

答案 2 :(得分:1)

您的比较必须反对整数,请注意'2' < '12' == False
您可以更改复杂条件以仅测试边界条件:

if int(i[1]) <= int(j[2]) and int(j[1]) <= int(i[2]):

if max(int(i[1]), int(j[1])) <= min(int(i[2]), int(j[2])):

这些应该足以确定范围是否重叠。

我没有暗示这一点,但如果您接受略有不同的输出,可以通过理解来完成:

>>> [(l, [a for a, a_start, a_end in A
...       if int(l_start) <= int(a_end) and int(a_start) <= int(l_end)])
...  for l, l_start, l_end in L]
[('cat', ['coordOne']),
 ('cat', ['coordTwo', 'coordThree']),
 ('cat', ['coordFour'])]

BTW OP算法的预期输出是:

[['cat', 'coordOne'], ['cat', 'coordTwo'], ['cat', 'coordThree'], ['cat', 'coordFour']]

你也可以理解这一点。

答案 3 :(得分:0)

ijint。在条件中使用L[i][...]A[j][...]

答案 4 :(得分:0)

for i in range(len(L)):
    for j in range (len(A)):

ij这两种类型都是int,如果您希望它们是LA中的元素,请使用:

for i in L:
    for j in A:

因此,改变:

newList.append(L[i][0], A[j][0])

为:

newList.append([i[0], j[0]])

代码现在运行,但结果不是预期的,这需要更多的工作。