从列表python中删除元素的首次出现

时间:2018-10-01 12:38:15

标签: python

我有两个列表:

List_main = ['a','b','c','d','e','f','g','h']

List_sub = ['c','f','d']

我现在将这些列表加入了:

 list_joined = ['a','b','c','d','e','f','g','h','c','f','d']

我想从联接列表“ list_joined”中删除List_sub中第一次出现的元素。

我正在寻找的最终输出是获得一个列表,该列表的末尾附加了List_sub元素。

['a','b','e','g','h','c','f','d']

我尝试了一种方法,从List_main中找出sub_list元素的索引。

[i for i,x in enumerate(path_stores_new) if x == value ]

然后使用

del list_joined[index]

但是我认为可能会有更好的方法。 有线索吗?

注意:List_main具有唯一值

8 个答案:

答案 0 :(得分:1)

使用列表理解可以轻松完成

一个衬里代码如下所示:

List_main = ['a','b','c','d','e','f','g','h']
List_sub = ['c','f','d']

list_joined = [i for i in List_main if i not in List_sub] + List_sub

编辑:

如果只忽略第一次出现,则上面的代码将忽略所有出现的代码,下面的代码应执行此工作。

List_main = ['a','b','c','d','e','f','g','h']
List_sub = ['c','f','d']

list_joined = [value for ind, value in enumerate(List_main) if value not in List_sub or ind > List_main.index(value)] + List_sub

答案 1 :(得分:0)

您可以先将List_main转换为dict,删除基于List_sub的键,然后将其余键与List_sub结合起来,以便删除{{ 1}}的平均时间复杂度为O(1)(否则在列表中查找和删除元素,每个元素的平均花费为O(n))

List_sub

这将输出:

dict_main = dict.fromkeys(List_main)
for k in List_sub:
    del dict_main[k]
print(list(dict_main) + List_sub)

如果您未使用Python 3.7,则可以使用['a', 'b', 'e', 'g', 'h', 'c', 'f', 'd'] 代替collections.OrderedDict

答案 2 :(得分:0)

或者,您也可以像这样使用内置的var baseClusterer = new KMeans() .setFeaturesCol("scaledFeatures") .setPredictionCol("clusters") .setSeed(0) 2 to 10 map { baseClusterer = baseClusterer.setK(k) baseClusterer.fit(scaledDF).computeCost(scaledDF) } 函数:

filter

这将输出List_main = ['a','b','c','d','e','f','g','h'] List_sub = ['c','f','d'] sub_filter = lambda x: x not in List_sub list_joined = list(filter(sub_filter, List_main)) + List_sub

答案 3 :(得分:0)

我不会做与@Rakesh完全相同的事情,即使我们的答案非常相似,我只是发送我会做的事情。 :)

['a', 'b', 'e', 'g', 'h', 'c', 'f', 'd']

答案 4 :(得分:0)

您可以过滤第一个列表中未包含的元素,然后将结果扩展到第二个列表中:

List_main = ['a','b','c','d','e','f','g','h']
List_sub = ['c','f','d']
list(filter(lambda x : x not in List_sub, List_main)) + List_sub

输出:

['a', 'b', 'e', 'g', 'h', 'c', 'f', 'd']

答案 5 :(得分:0)

尝试一下:

from itertools import filterfalse

def f(x):
     if x in List_sub:
         List_sub.remove(x)
         return True
     return False

list(filterfalse(f, list_joined))

答案 6 :(得分:0)

如果要忽略首次出现,请执行以下操作:

List_main = ['a','b','c','d','e','f','g','h']
List_sub = ['c','f','d']
dict_main = dict.fromkeys(List_sub)
list_joined = []

for x in List_main:
if x in dict_main.keys():
    if dict_main[x] is None:
        dict_main[x] = 1
    else:
        list_joined += x
else:
    list_joined += x
list_joined += List_sub

print(list_joined)

答案 7 :(得分:-1)

您可以使用以下代码将其删除:

list_main = ['a','b','c','d','e','f','g','h']

list_sub = ['c','f','d']
for sub_item in list_sub:
    if sub_item in list_main:
        list_main.remove(sub_item)
list_main += sub_item

或者只是不添加重复的项目:

list_main = ['a','b','c','d','e','f','g','h']

list_sub = ['c','f','d']
for sub_item in list_sub:
    if sub_item not in list_main:
        list_main.append(sub_item)

此外,如果您不想重复项目,可以使用set。但是请注意,set不会保留元素的初始顺序。

list_main = ['a','b','c','d','e','f','g','h']
list_sub = ['c','f','d']
result_list = list(set(list_main + list_sub))