我很好奇你是否可以从列表列表中删除重复项并将uniques作为列表返回。我正在尝试这个:
def do_list( lists ):
res = [ [ one for one in temp if one not in res ] for temp in lists ]
return res
例如,如果:
lists = [ [ "a","b","c" ],[ "d","a" ],[ "c","a","f" ] ]
结果应该是:
[ "a","b,"c","d","f" ]
但它给了我错误,我在分配之前参考变量res。
答案 0 :(得分:7)
你可以这样做:
set(itertools.chain.from_iterable(lists))
set
将删除所有重复内容,set
内部只是将您的列表展平为单个列表。
答案 1 :(得分:2)
您收到错误,因为您在理解中引用了-(defun mc/mark-all-in-region (beg end)
+(defun mc/mark-all-in-region (beg end &optional search)
"Find and mark all the parts in the region matching the given search"
(interactive "r")
- (let ((search (read-from-minibuffer "Mark all in region: "))
+ (let ((search (or search (read-from-minibuffer "Mark all in region: ")))
(case-fold-search nil))
(if (string= search "")
(message "Mark aborted")
。这不起作用,因为res
仅在表达式完成后可用。
由于我很好奇,并且因为标题要求“使用列表理解从列表列表中删除重复”,我想看看你是否可以使用 列表理解来做到这一点,而不是作弊,例如使用res
:p
以下是:
itertools
为了获得更多精神错乱,您可以将它们组合在一条线上,但您必须重复>>> lists = [ [ "a","b","c" ],[ "d","a" ],[ "c","a","f" ] ]
>>> lists2 = sorted(sum(lists, []))
>>> [ item for i, item in enumerate(lists2) if i == 0 or i == len(lists2) or lists2[i - 1] != item ]
['a', 'b', 'c', 'd', 'f']
和sum()
次来电。我无法动摇自己编写如此丑陋的代码; - )
sorted()
会使列表变得扁平;它返回sum(lists, [])
中所有项目的总和(+
运算符),其中lists
为初始列表。[]
将对其进行排序。这是必需的,因为我们只检查最后一项sorted()
语句检查前一项是否与当前项相同。但它是丑陋的和非Pythonic。 对于Guido的爱,请使用Pythonista的答案(或其中的一些变体)!
答案 2 :(得分:1)
res
尚未创建。您可以使用set
删除重复项:
res = list(set(sum(lists, [])))
如果你想要它排序:
res = sorted(set(sum(lists, [])))
如果你想要它的确切排序,列表理解可能不是最好的方法。相反,这样做:
res = []
for temp in lists:
res.append([])
for one in temp:
if one not in res[-1]:
res[-1].append(one)