如何删除此列表中的重复元素?
Posted
技术标签:
【中文标题】如何删除此列表中的重复元素?【英文标题】:How to delete repeat elements in this list? 【发布时间】:2019-11-09 18:54:41 【问题描述】:我有一个列表是a = ['R','R','R','B','R','B','B','S','S']
。我的目标是删除重复的“R”和“S”,然后删除“B”(如果只有一个 R 或 S,就保留它)。因此,我希望输出为 ['R','R','S'],但我的是 ['R','S']。
谁能帮我看看我的代码?谢谢
这是我的代码
a = ['R','R','R','B','R','B','B','S','S'] # create a list to store R S B
a = [x for x in a if x != 'B'] # Delete all the B's
new_list = [] # create another list to store R and S without repeat
last = None
for x in a:
if last == x and (len(new_list) == 0 or new_list[-1] != x):
new_list.append(last)
last = x
print(new_list)
我的输出是这样的
['R', 'S']
但我想要这个
['R','R','S']
【问题讨论】:
delete every repeat R's and S's between B.
,那么不应该删除R's
,因为B和S之间没有重复的R
?
重新阅读后,我删除了下面的答案,因为您的问题实际上没有意义。在您开始的列表中,B 之间没有重复的 R 或 S。根据这个描述,您的结果应该是['R','R','R','B','R','B','B','S','S']
,所以要么您的描述是错误的,要么您的结果是错误的。请澄清。
我认为我的描述是错误的。如果没有重复就保留它。输出是我想要的。不管有多少个R B S,我只想在删除B后只保留R和S一次。这样有意义吗?
@WenxuanLi,但您似乎也在删除重复的 R 和 S 值,这些值在 B 之间 not。我认为我下面的答案是您正在寻找的,但不是不好解释。也许你应该说你想删除组合在一起的 R 和 S 的重复。
是的,也许我的描述很混乱,但我不想在 B 之前或之后重复 R 和 S。
【参考方案1】:
您可以先使用itertools.groupby
对元素进行分组,然后删除B
值:
from itertools import groupby
a = ['R','R','R','B','R','B','S','S'] # create a list to store R S B
[k for k, v in groupby(a) if k != 'B']
结果:
['R', 'R', 'S']
【讨论】:
【参考方案2】:你可以试试这个。这将创建一个新列表,其中没有任何重复内容,也没有“B”。
a = ['R','R','R','B','R','B','B','S','S']
new_list = [] # create another list to store R and S without repeat
last = None
for x in a:
if last != x and x!='B':
new_list.append(x)
last = x
print(new_list)
另一种选择是使用列表推导:
a = ['R','R','R','B','R','B','B','S','S']
new_list = [ x for i,x in enumerate(a) if (a[i-1] != x and x!='B') or (i==0) ]
print(new_list)
两个例子的输出都是一样的:
['R', 'R', 'S']
这些选项都不需要导入。但是,我认为 Mark Meyer 给出的 groupby 代码是我在大多数情况下会使用的。
【讨论】:
【参考方案3】:在这种情况下,您可以使用fromkeys
。
mylist = ["a", "b", "a", "c", "c"]
mylist = list(dict.fromkeys(mylist))
print(mylist) # ['a', 'b', 'c']
【讨论】:
问错了吗?这在这里毫无意义。 这给出了 ['R', 'B', 'S'] 这不是提问者想要的输出。以上是关于如何删除此列表中的重复元素?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用原始元素删除 ArrayList 中的重复值[重复]