0

如何删除 list_a 中的所有列表,这些列表是 list_a 中先前列表的反向列表?

list_a = [[1,2,3],[5,4],[4,5],[3,2,1]]

应该给

[[1,2,3],[5,4]]
4

6 回答 6

5
>>> 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]]
于 2013-06-20T11:18:04.003 回答
2

有点神秘,但在我看来,实现这一目标的优雅方式是:

[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]]
于 2013-06-20T11:35:40.977 回答
2

list如果您确实需要,可以将结果转换回s:

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]]

我不确定你想要哪个结果

于 2013-06-20T11:21:08.537 回答
0

您可以使用哈希来完成它。

 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]]
于 2013-06-20T11:26:20.200 回答
0

实现此目的的一个非常简单的方法如下。

我们在这里假设任何一个元素都不能在输出列表中出现多次:

#!/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]]
于 2013-06-20T11:34:17.450 回答
0

其他答案已经在某种程度上进行了优化,这是一种“幼稚”的方法,旨在提高可读性和可理解性。它会比使用 set 或 dict 的答案慢,但如果您的列表大小不是很大,这可能并不重要:

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)
于 2013-06-20T11:35:31.497 回答