基于另一个列表中的元素,从一个列表中删除元素。

3

我有两个像这样的列表:

options = [['64', '32', '42', '16'], ['Sit', 'Beg', 'Shake', 'Catch'], ['Lion', 'Dog', 'Cat', 'Puppy']]
right_answer = ['42', 'Sit', 'Puppy']

我想从选项中删除正确答案并获得以下输出:
incorrect_answer = [['64', '32', '16'], ['Beg', 'Shake', 'Catch'], ['Lion', 'Dog', 'Cat']]

我尝试使用 .remove(),但它会清空列表:
for i in range(0,len(options)):
   incorrect_answers = options[i].remove(right_answer[i])
4个回答

3
一段简单的带有zip的列表推导式,不会改变原始列表。
incorrect_answers = [[answer for answer in possible if answer != correct] for possible, correct in zip(options, right_answer)]

在线试用Python 3!


1

您可以使用zip:

for o, r in zip(options, right_answer):
    o.remove(r)
    
print(options)

1
我需要将输出放在一个新列表中,而不是修改选项。 - Pushpesh Kumar
1
@PushpeshKumar,你多次表示想要“删除”。创建一个新列表并不是“删除”。 - Kelly Bundy

0
options = [['64', '32', '42', '16'], ['Sit', 'Beg', 'Shake', 'Catch'], ['Lion', 'Dog', 'Cat', 'Puppy']]
right_answer = ['42', 'Sit', 'Puppy']

print([[e for e in opt if e not in right_answer] for opt in options])

结果:

[['64', '32', '16'], ['Beg', 'Shake', 'Catch'], ['Lion', 'Dog', 'Cat']]

这可能会导致潜在的问题,如果有一些问题的字符串与可能的答案相同,那么就会产生错误的结果,因为你只是检查它是否在列表中,而不关心顺序。 - Samathingamajig

0

你可以使用带有列表推导式的简单循环来保留不在正确答案中的元素。

incorrect_answers = []
for i, my_list in enumerate(options):
    incorrect_answers.append([x for x in my_list if x != right_answer[i]])

print(incorrect_answers)
# [['64', '32', '16'], ['Beg', 'Shake', 'Catch'], ['Lion', 'Dog', 'Cat']]

如果有一些问题的字符串与可能的答案相同,那么这种方法可能会产生错误的结果,因为您只是检查它是否在列表中,而不关心顺序。 - Samathingamajig
@Samathingamajig 是的,你说得对。为了解决这个问题,也许我们可以稍微改变一下代码,像这样:for i, my_list in enumerate(options): incorrect_answers.append([x for x in my_list if x != right_answer[i]]) - Peter Likos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接