繁体   English   中英

迭代 2 个列表以在同一索引中查找相同的元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM