我是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'对象不可调用的错误。
答案 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)):
几乎总是一种反模式。您只能使用i
和j
来索引这两个列表;只是做:
for l in L:
(但选择更好的变量名称 - 通常将列表命名为复数,如things
和for 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)
i
和j
是int
。在条件中使用L[i][...]
和A[j][...]
。
答案 4 :(得分:0)
for i in range(len(L)):
for j in range (len(A)):
i
和j
这两种类型都是int
,如果您希望它们是L
和A
中的元素,请使用:
for i in L:
for j in A:
因此,改变:
newList.append(L[i][0], A[j][0])
为:
newList.append([i[0], j[0]])
代码现在运行,但结果不是预期的,这需要更多的工作。