gpt4 book ai didi

python - 删除差异但保持 python 列表中的顺序和重复项

转载 作者:太空宇宙 更新时间:2023-11-03 15:55:44 25 4
gpt4 key购买 nike

使用版本 3.x - 想知道解决以下问题的最简单和原生的方法:

示例列表:

listA = [1, 2, 3, 66, 0]
listB = [0, 0, 1, 2, 3, 66, 0, 99, 0, 3]

如何消除两个列表之间的差异,以便新的 listC 与 listA 具有完全相同的顺序?

因此,使用上面的示例,listC 应该等于 [1, 2, 3, 66, 0]

列表 A 可能比列表 B 大,另一个条件是列表 A 永远不会有重复编号,而列表 B 可能有重复项。

我试图解决的慈善俱乐部练习是:

林迪的大脑测试:

请编写一个程序,如果 B 的元素按照它们在 B 中出现的顺序(但不一定是连续的)出现在 A 中,则打印“YES”。否则程序应该打印“NO”。

林迪的奖金测试:

请编写一个程序,如果 B 的元素出现在 A 中,则打印“YES”它们在 B 中出现的顺序并连续。

显然,如果有人喜欢这个挑战,请发布完整的程序来解决这两个问题。

最佳答案

另一种稍微作弊的方法是使用带有 in 运算符的字符串。如果将每个列表转换为字符串,您可以快速查看 A 是否是 B 的子字符串(按相同顺序且连续)。

def aInB(listA, listB):
str_a = "," + ",".join([str(c) for c in listA]) + ","
# ',1,2,3,66,0,'
str_b = "," + ",".join([str(c) for c in listB]) + ","
# ',0,0,1,2,3,66,0,99,0,3,'

return str_a in str_b
# True

现在这仅在 A 的长度小于 B 的情况下才有效,但根据问题的定义,听起来这总是正确的。由于 @stefanpochmann 在评论中指出的问题,额外的逗号是必要的。

打印“YES”和“NO”非常简单:

if aInB(listA, listB):
print("YES")
else:
print("NO")

对于非连续方法,我相信您必须采用其中一种迭代方法。此解决方案只是提供另一种思考“A in B”的方法。

编辑:我无法控制自己,所以这里有一种交互式方法,可能有点过分了,但也许你会发现它更容易理解(你永远不知道)。

def aInB(listA, listB):
# if listA is empty, don't even bother
if not listA:
return False

# build a dictionary where each key is a character in listA
# and the values are a list containing every index where that character
# appears in listB
occurences = {c:[i for i,e in enumerate(listB) if e==c] for c in listA}

# now we are going to walk through listA again
# but this time we are going to use our `occurences` dictionary
# to verify that the elements appear in order
last_index = 0
for i,e in enumerate(listA):
# if the character `e` never appears in listB
# then it will have an empty list
# and we can return False
if not occurences[e]:
return False

# now the next possible index for the next character in listA
# must be *greater* than the index of the last character we found
# if no such index exists, then listA is not contained within listB
# if it is, we update the last seen index
next_possible_index = [x for x in occurences[e] if x > last_index]
if not next_possible_index:
return False
last_index = next_possible_index[0]

# if we make it out of the for loop
# then all is well, and listA is contained in listB
# but not necessarily consequtively
return True

关于python - 删除差异但保持 python 列表中的顺序和重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40823400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com