比较列表数组中的相邻元素 - Python 3.4.3
Compare Neighboring Elements in an Array of Lists - Python 3.4.3
将第一个列表的最后一个元素与紧邻其右侧的列表的第一个元素或其在 Python 3.4.3
中的“邻居”进行比较
基本上,我所做的是循环遍历每个列表并提取第一个和最后一个元素并将它们全部放入一个列表中。然后,我将那个列表全部向下移动一个,然后将最后一个元素放在前面,然后将原始元素和切分的元素压缩在一起。我比较生成的每个元组的第一个和第二个元素。我需要所有元素都相等,或者至少我需要检查该条件。
arr = [ [9, 2, 3, 4], [4, 1], [1, 1, 1], [1, 2, 5, 7, 9] ]
^ == ^
# it has to compare the first of the first and the last of the last
arr = [ [9, 2, 3, 4], [4, 1], [1, 1, 1], [1, 2, 5, 7, 9] ]
^ ^ ^ ^ ^ ^
# it has to compare all the elements that "touch", or are next to each other
不正确的输出(我生成的)
[(9, 9), (4, 9), (4, 4), (1, 4), (1, 1), (1, 1), (1, 1), (9, 1)]
# (4, 9) (1, 4) and (1,1 count of 2 not 3) (9, 1)
# shouldn't be in the answer
应该生产:
[(9, 9), (4, 4), (1, 1), (1, 1), (9, 1)] #edited
源代码
def check(arr):
res = []
for l in lst:
front, back = l[0], l[-1]
res.append(front)
res.append(back)
z = zip(temp, [res[-1]] + res[:-1])
print(z)
check( [ [9, 2, 3, 4], [4, 1], [1, 1, 1], [1, 2, 5, 7, 9] ] )
我看到问题是它正在获取我的 arr 中第一个列表的第一个和最后一个元素并进行比较。 (例如 [9, 2, 3, 4]
正在比较 9
和 4
,这是不应该的。我不知道如何解决这个问题,因为我没有办法检查它们是否来自同一个数组或不。
我看了 this stack overflow question 和其他一些人,但他们没有具体回答我的 NEEDS
。感谢您的帮助:)
假设您的预期输出有错字,您可以使用 zip
:
lst = [[9, 2, 3, 4], [4, 1], [1, 1, 1], [1, 2, 5, 7, 9]]
output = [(xs[-1], ys[0]) for xs, ys in zip((lst[-1], *lst), lst)]
print(output) # [(9, 9), (4, 4), (1, 1), (1, 1)]
如果您的 Python 版本是 3.10+,请考虑 itertools.pairwise
:
>>> arr = [ [9, 2, 3, 4], [4, 1], [1, 1, 1], [1, 2, 5, 7, 9] ]
>>> [(i[-1], j[0]) for i, j in pairwise(arr[-1:] + arr)]
[(9, 9), (4, 4), (1, 1), (1, 1)]
判断是否都一样,使用all
:
>>> all(i[-1] == j[0] for i, j in pairwise(arr[-1:] + arr))
True
def check(arr):
if len(arr) < 2:
return False
elif len(arr) == 2:
return arr[0][0] == arr[-1][-1] and arr[0][-1] == arr[1][0]
res = []
for i in range(1, len(arr)):
ele1, ele2 = arr[i-1][-1], arr[i][0]
res.append(ele1 == ele2)
res.append(arr[0][0] == arr[-1][-1])
return all(res)
将第一个列表的最后一个元素与紧邻其右侧的列表的第一个元素或其在 Python 3.4.3
中的“邻居”进行比较基本上,我所做的是循环遍历每个列表并提取第一个和最后一个元素并将它们全部放入一个列表中。然后,我将那个列表全部向下移动一个,然后将最后一个元素放在前面,然后将原始元素和切分的元素压缩在一起。我比较生成的每个元组的第一个和第二个元素。我需要所有元素都相等,或者至少我需要检查该条件。
arr = [ [9, 2, 3, 4], [4, 1], [1, 1, 1], [1, 2, 5, 7, 9] ]
^ == ^
# it has to compare the first of the first and the last of the last
arr = [ [9, 2, 3, 4], [4, 1], [1, 1, 1], [1, 2, 5, 7, 9] ]
^ ^ ^ ^ ^ ^
# it has to compare all the elements that "touch", or are next to each other
不正确的输出(我生成的)
[(9, 9), (4, 9), (4, 4), (1, 4), (1, 1), (1, 1), (1, 1), (9, 1)]
# (4, 9) (1, 4) and (1,1 count of 2 not 3) (9, 1)
# shouldn't be in the answer
应该生产:
[(9, 9), (4, 4), (1, 1), (1, 1), (9, 1)] #edited
源代码
def check(arr):
res = []
for l in lst:
front, back = l[0], l[-1]
res.append(front)
res.append(back)
z = zip(temp, [res[-1]] + res[:-1])
print(z)
check( [ [9, 2, 3, 4], [4, 1], [1, 1, 1], [1, 2, 5, 7, 9] ] )
我看到问题是它正在获取我的 arr 中第一个列表的第一个和最后一个元素并进行比较。 (例如 [9, 2, 3, 4]
正在比较 9
和 4
,这是不应该的。我不知道如何解决这个问题,因为我没有办法检查它们是否来自同一个数组或不。
我看了 this stack overflow question 和其他一些人,但他们没有具体回答我的 NEEDS
。感谢您的帮助:)
假设您的预期输出有错字,您可以使用 zip
:
lst = [[9, 2, 3, 4], [4, 1], [1, 1, 1], [1, 2, 5, 7, 9]]
output = [(xs[-1], ys[0]) for xs, ys in zip((lst[-1], *lst), lst)]
print(output) # [(9, 9), (4, 4), (1, 1), (1, 1)]
如果您的 Python 版本是 3.10+,请考虑 itertools.pairwise
:
>>> arr = [ [9, 2, 3, 4], [4, 1], [1, 1, 1], [1, 2, 5, 7, 9] ]
>>> [(i[-1], j[0]) for i, j in pairwise(arr[-1:] + arr)]
[(9, 9), (4, 4), (1, 1), (1, 1)]
判断是否都一样,使用all
:
>>> all(i[-1] == j[0] for i, j in pairwise(arr[-1:] + arr))
True
def check(arr):
if len(arr) < 2:
return False
elif len(arr) == 2:
return arr[0][0] == arr[-1][-1] and arr[0][-1] == arr[1][0]
res = []
for i in range(1, len(arr)):
ele1, ele2 = arr[i-1][-1], arr[i][0]
res.append(ele1 == ele2)
res.append(arr[0][0] == arr[-1][-1])
return all(res)