Python 如何选择列表列表中的某些项并检查它是否存在于元组列表中

Python 如何选择列表列表中的某些项并检查它是否存在于元组列表中,python,list,for-loop,if-statement,tuples,Python,List,For Loop,If Statement,Tuples,假设我有元组列表边=[(0,1)、(0,3)、(0,4)、(1,2)、(1,3)、(1,4)、(2,3)、(2,4)]和列表列表 顶点=[[1,4,2,3,0],[3,0,1,2,4],[2,3,0,1,4],[1,3,2,1,4],[0,3,2,4,1]。然后我想检查顶点中每个列表的第一个和最后一个元素是否存在于边中,然后做一些事情 例如,在第一个顶点列表中,它是[1,4,2,3,0],第一个和最后一个项目是1和0存在于边(0,1)(可以是(0,1)和(1,0)),然后对所有顶点列表执行一些相

假设我有元组列表
边=[(0,1)、(0,3)、(0,4)、(1,2)、(1,3)、(1,4)、(2,3)、(2,4)]
和列表列表
顶点=[[1,4,2,3,0],[3,0,1,2,4],[2,3,0,1,4],[1,3,2,1,4],[0,3,2,4,1]
。然后我想检查顶点中每个列表的第一个和最后一个元素是否存在于边中,然后做一些事情

例如,在第一个顶点列表中,它是
[1,4,2,3,0]
,第一个和最后一个项目是
1
0
存在于边
(0,1)
(可以是(0,1)和(1,0)),然后对所有顶点列表执行一些相同的操作。我不知道如何继续下面的代码

edges = [(0,1),(0,3),(0,4),(1,2),(1,3),(1,4),(2,3),(2,4)]
vertices = [[1,4,2,3,0],[3,0,1,2,4],[2,3,0,1,4],[1,3,2,1,4],[0,3,2,4,1]]

for i in range(len(vertices)):
    if vertices[i][0] and vertices[i][-1] in edges:
        do stuff...

如果要将值与元组进行比较,则可能需要将它们转换为元组:

for idx, i in enumerate(vertices):
    t = tuple((i[0], i[-1]))
    if t in edges:
        print(f'Item {idx} matches edge {t}.')
    elif t[::-1] in edges:
        print(f'Item {idx} matches edge {t[::-1]}.')

Out:
Item 0 matches edge (0, 1).
Item 2 matches edge (2, 4).
Item 3 matches edge (1, 4).
Item 4 matches edge (0, 1).
编辑:一个更通用的版本,可以为顶点和边提供匹配项的索引

for idx, i in enumerate(vertices):
    t = tuple((i[0], i[-1]))
    for j, k in enumerate(edges):
        if t == k:
            print(f'Vertex {idx} matches edge {t} at index {j}.')
        elif t[::-1] == k:
            print(f'Vertex {idx} matches edge {t[::-1]} at index {j}.') 

Out:
Vertex 0 matches edge (0, 1) at index 0.
Vertex 2 matches edge (2, 4) at index 7.
Vertex 3 matches edge (1, 4) at index 5.
Vertex 4 matches edge (0, 1) at index 0. 

如果要将值与元组进行比较,则可能需要将它们转换为元组:

for idx, i in enumerate(vertices):
    t = tuple((i[0], i[-1]))
    if t in edges:
        print(f'Item {idx} matches edge {t}.')
    elif t[::-1] in edges:
        print(f'Item {idx} matches edge {t[::-1]}.')

Out:
Item 0 matches edge (0, 1).
Item 2 matches edge (2, 4).
Item 3 matches edge (1, 4).
Item 4 matches edge (0, 1).
编辑:一个更通用的版本,可以为顶点和边提供匹配项的索引

for idx, i in enumerate(vertices):
    t = tuple((i[0], i[-1]))
    for j, k in enumerate(edges):
        if t == k:
            print(f'Vertex {idx} matches edge {t} at index {j}.')
        elif t[::-1] == k:
            print(f'Vertex {idx} matches edge {t[::-1]} at index {j}.') 

Out:
Vertex 0 matches edge (0, 1) at index 0.
Vertex 2 matches edge (2, 4) at index 7.
Vertex 3 matches edge (1, 4) at index 5.
Vertex 4 matches edge (0, 1) at index 0. 

是的,正如Nick所说,它应该包括(1,0)和(0,1)。@Aras更新了答案,所以现在它包括了这两个。(0,1)可以有任何索引。您的代码仅适用于此特定情况。你能概括一下吗?@Aras,更新了。我希望这就是你需要的。是的,正如尼克所说,它应该同时包含(1,0)和(0,1)。@Aras,更新了答案,所以现在它同时包含了这两个。(0,1)可以有任何索引。您的代码仅适用于此特定情况。你能概括一下吗?@Aras,更新了。我希望这就是你需要的。