如何在Python中将列表项构建为一个集合?

272

我在 Python 中有一个文件名的 list,我想创建一个包含所有文件名的 set

filelist=[]
for filename in filelist:
    set(filename)

这似乎不起作用。我该怎么做?

8个回答

448

如果您有一个可哈希对象的列表(文件名可能是字符串,因此应计入计数):

lst = ['foo.py', 'bar.py', 'baz.py', 'qux.py', Ellipsis]

你可以直接构建这个集合:

s = set(lst)

实际上,set 对于 任何可迭代对象 都可以这样工作!(鸭子类型好啊!)


如果你想以迭代方式执行:

s = set()
for item in iterable:
    s.add(item)

但很少需要这样做。我之所以提到它,是因为set.add方法非常有用。


1
我正在使用2.7版本,但似乎无法正常工作。这里发生了什么事? Python 2.7.13 (默认值,Jul 24 2017, 14:22:59) [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] 在darwin上 键入“help”、“copyright”、“credits”或“license”以获取更多信息。
x = [1,2,3] set(x) set([1, 2, 3])
- opus111
@user1902291-- 看起来它已经起作用了,你只需要跟踪结果集:y = set(x) - mgilson
还要注意的是,从列表中向集合添加项在想要过滤出重复项的列表时非常有用。 - Pranjal Kumar
s = {'foo.py', 'bar.py', 'baz.py', 'qux.py', Ellipsis}怎么样? - Jari Turkia
是的,那可以工作--虽然它实际上并没有构建一个集合的列表项,就像OP所请求的那样:). 这是在创建一个集合文字。 - mgilson

26

最直接的解决方案是:

s = set(filelist)

原始代码中的问题在于值没有被分配给集合。以下是修复后的代码:

s = set()
for filename in filelist:
    s.add(filename)
print(s)

21

你可以做

my_set = set(my_list)

或者,在Python 3中,

my_set = {*my_list}

从列表创建一个集合。相反,您也可以这样做

my_list = list(my_set)

或者,在Python 3中,

my_list = [*my_set]

从一个集合中创建一个列表。

需要注意的是,将列表转换为集合时,元素的顺序通常会丢失,因为集合本质上是无序的。(然而,在 CPython 中有一个例外,似乎只有当列表仅由非负整数组成时才会保留顺序,但我假设这是 CPython 中设置实现的结果,并且这种行为可能会因不同的 Python 实现而异。)


6
这里有另一种解决方案:
>>>list1=["C:\\","D:\\","E:\\","C:\\"]
>>>set1=set(list1)
>>>set1
set(['E:\\', 'D:\\', 'C:\\'])

在这段代码中,我使用了set方法将其转换为一个集合,然后它从列表中删除了所有重复的值。

2
你可以使用列表推导式来创建集合。
s = {i for i in range(5)}

1

简单来说,这一行:

new_list = set(your_list)

0
所有上述答案都是正确的,但如果你想保留列表的顺序,你需要按照以下步骤进行操作。
list(dict.fromkeys(your_list))

0

一种常见的迭代构建集合的方法如下:

aset = {e for e in alist}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接