[英]Iterating over lists in a series to find similiiar elements in the list in python
[英]Iterating over 2 lists to find identical elements in the same index
给定两个长度相同的列表:
## TEST 1
lst1 = ["g", "r", "y", "r"]
lst2 = ["y", "g", "o", "r"]
## TEST 2
lst1 = ["g", "r", "y", "r"]
lst2 = ["o", "g", "g", "g"]
预期 output 为:
## TEST 1 OUTPUT
BWW
## TEST 2 OUTPUT
W
如果两个列表中相同索引中存在的每个相同元素被赋予值“B”,并且每个元素存在于另一个列表中但不在相同索引处,则赋予值“W”。 如果元素不匹配,则不执行任何操作,请参阅##TEST2。 Output 应该总是在 W 之前打印出 B,除非只有两个列表中存在但不在同一索引中的元素,因此 output 将简单地为“W”。
我的代码:(隐藏和猜测的格式与 lst1&2 类似,长度始终为 4,包含单个字母字符串。)
def give_feedback(hidden, guess):
hidden_copy = hidden[:]
feedback = []
for i in range(len(guess)):
if guess[i] == hidden[i]:
hidden_copy.remove(guess[i])
hidden.remove(guess[i])
feedback += ["B"]
else:
if guess[i] in hidden:
hidden_copy.remove(guess[i])
hidden.remove(guess[i])
feedback += ["W"]
return sorted(feedback)
截至目前,它只是返回消息
ListError list index out or range
我要做的第一件事是检查 arrays 的长度是否相同。 这将避免您的冲突,因为您正在使用其中一个的长度对两个 arrays 进行迭代。
第二件事,不要从您正在迭代的数组中删除元素。 在这部分:
else:
if guess[i] in hidden:
hidden_copy.remove(guess[i])
hidden.remove(guess[i])
feedback += ["W"]
您从hidden
中删除下一个索引可能需要的项目。
由于您已经在复制hidden
数组,我建议您仅从副本hidden_copy
copy 中删除项目并保持原样,因此您可以继续迭代它(例如 ifguess if guess[i] == hidden[i]:
) 没有问题。
这应该有效:
def give_feedback(hidden, guess):
hidden_copy = hidden[:]
feedback = []
for i in range(len(guess)):
if guess[i] == hidden[i]:
hidden_copy.remove(guess[i])
feedback += ["B"]
else:
if guess[i] in hidden:
hidden_copy.remove(guess[i])
feedback += ["W"]
return sorted(feedback)
尝试这种方式使用ZIP()通过相同的索引一次迭代多个数据结构。
lst1 = ["g", "r", "y", "r"]
lst2 = ["y", "g", "o", "r"]
hidden_copy = lst1[:]
feedback = []
for i,j in zip(lst1,lst2):
if j == i:
hidden_copy.remove(i)
feedback += ["B"]
else:
if i in lst1:
hidden_copy.remove(i)
feedback += ["W"]
sorted(feedback)
一般来说,对于这类问题,有多种解决方案。 这取决于您要优化的内容。 通常人们想要优化时间复杂度,即运行时间如何随着输入的长度而缩放。 使用当前提供的解决方案,需要花费大量时间检查 arrays 中是否存在元素,如果您的输入数组很长,则该元素的扩展性很差。
更有效的解决方案可能是使用计数器:
from collections import Counter
def give_feedback(hidden, guess):
hidden_c = Counter(hidden)
guess_c = Counter(guess)
elements_in_both_lists = 0
for x in hidden_c:
elements_in_both_lists += min(hidden_c[x], guess_c[x])
elements_at_same_index = 0
for i, j in zip(hidden, guess):
if i == j:
elements_at_same_index += 1
result = "B" * elements_at_same_index + "W" * (elements_in_both_lists - elements_at_same_index)
return result
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.