234

list在 python 中有一个文件名,我想set从所有文件名中构造一个。

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

这似乎不起作用。怎么能做到这一点?

4

8 回答 8

415

如果你有一个可散列对象列表(文件名可能是字符串,所以它们应该计算在内):

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方法非常有用。

于 2013-04-02T16:02:53.770 回答
19

最直接的解决办法是这样的:

s = set(filelist)

原始代码中的问题是未将值分配给set。这是您的代码的固定版本:

s = set()
for filename in filelist:
    s.add(filename)
print(s)
于 2013-04-02T16:14:50.193 回答
16

你可以做

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 实现而异。)

于 2017-11-15T17:03:29.770 回答
5

这是另一个解决方案:

>>>list1=["C:\\","D:\\","E:\\","C:\\"]
>>>set1=set(list1)
>>>set1
set(['E:\\', 'D:\\', 'C:\\'])

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

于 2017-01-26T11:33:44.110 回答
0

简单地说:

new_list = set(your_list)
于 2019-07-20T08:08:44.483 回答
0

一种以迭代方式构造集合的通用方法,如下所示:

aset = {e for e in alist}
于 2019-10-06T15:38:13.983 回答
0

您还可以使用列表推导来创建集合。

s = {i for i in range(5)}
于 2021-01-05T06:12:05.087 回答
0

以上所有答案都是正确的,但是如果您想保留列表的顺序,则需要按照以下步骤进行

list(dict.fromkeys(your_list))
于 2022-02-01T02:54:52.933 回答