[英]Removing reverse elements in a Python list
如何删除list_a中先前列表的反向列表的list_a中的所有列表?
list_a = [[1,2,3],[5,4],[4,5],[3,2,1]]
应该给
[[1,2,3],[5,4]]
>>> l = [[1, 2, 3], [5, 4], [4, 5], [3, 2, 1]]
>>> seen = set()
>>> [x for x in l if tuple(x[::-1]) not in seen and not seen.add(tuple(x))]
[[1, 2, 3], [5, 4]]
如果确实需要,可以将结果转换回list
。
res, seen = [], set()
for x in map(tuple, list_a): # lists can't be hashed
find = {x, x[::-1]}
if not find.issubset(seen):
res.append(x) # you may use res.append(list(x)) if you have to
seen.update(find)
>>> res
[(1, 2, 3), (5, 4)]
请注意,这是在检查重复的项目以及重复的反向项目。 如果只希望后者,则可以使用@AshwiniChaudhary的方法
例如。 对于
list_a = [[3,2,1],[5,4],[4,5],[3,2,1]]
这种方法产生:
[[3,2,1],[5,4]]
而@Ashwini的方法产生:
[[3,2,1],[5,4],[3,2,1]]
我不确定你想要哪个结果
有点神秘,但我认为实现此目的的优雅方法是:
[v for k, v in enumerate(list_a) if v[::-1] not in list_a[:k]]
如果您还想删除重复项,请更改为:
[v for k, v in enumerate(list_a) if v[::-1] not in list_a[:k] and v not in list_a[:k]]
您可以使用哈希来完成它。
a=[[1,2,3],[5,4],[4,5],[3,2,1]]
d={};b=[]
for i in a:
try:
d[str(i)]+=1
except KeyError:
d[str(i)]=0;d[str(i[::-1])]=0
b.append(i)
print b
输出:
[[1,2,3],[5,4]]
实现这一目标的一种非常简单的方法如下。
我们在这里假设任何一个元素在输出列表中最多只能出现一次:
#!/usr/bin/env python
list_a = [[1,2,3],[5,4],[4,5],[3,2,1]]
list_out = []
for i in list_a:
i_r = i[::-1] # reverse the element
# check that it doesn't appear in the list, reversed or not...
if i_r not in list_out and i not in list_out:
list_out.append(i)
print "out: " + str(list_out)
如果您只是不希望重复,那么您想删除反向元素:
#!/usr/bin/env python
list_a = [[1,2,3],[5,4],[4,5],[3,2,1]]
list_out = []
for i in list_a:
i_r = i[::-1]
if i_r not in list_out:
list_out.append(i)
print "out: " + str(list_out)
并使用以下输入比较这两个函数:
list_a = [[1,2,3], [5,4], [4,5], [3,2,1], [1,2,3], [5,4]]
第一种方法的输出:
[[1, 2, 3], [5, 4]]
第二个输出:
[[1, 2, 3], [5, 4], [1, 2, 3], [5, 4]]
其他答案已经在某种程度上进行了优化,这是一种旨在设计为易于阅读和理解的“幼稚”方法。 它比使用集合或字典的答案要慢,但是如果列表大小不大,这可能并不重要:
list_a = [[1, 2, 3], [4, 5], [5, 4], [3, 2, 1]]
list_b = []
for item in list_a:
if not list(reversed(item)) in list_b:
list_b.append(item)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.