在Python列表中仅添加唯一项?

3

我正在运行一个 Python 网络爬虫脚本,获取到了以下列表 -

[u'UI/UX Designer\xa0\u2013 Creative Head ', u'UX Designer ', u'UI/UX Designer\xa0\u2013 Creative Head', u'UX Designer']

我想只从列表中添加唯一的项目,所以我使用了这个 -
profile_list = []
k = soup.body.findAll(text=re.compile("UX Designer"))
    for i in k:
        if i not in profile_list:
            profile_list.append(i)
    print profile_list

但是它没有起作用,重复的项目仍然存在。我也尝试使用set(),但在这里也不起作用。我应该怎么做才能只添加唯一的项目?
更新-感谢答案,我在这里犯了一个愚蠢的错误,列表中的两个重复单词有额外的空格,应该将其删除。所有答案都是正确的,因此选择了最早的答案。

为什么不在开始时将profile_list赋值为空集合(也许称其为profile_set),然后在for循环中添加项目呢? - edwinksl
我尝试使用了一个集合,但那也没起作用。 - doctorsherlock
3个回答

4

列表中的前两个字符串包含尾随空格。

带有空格的字符串和不带空格的字符串是不同的,即使其他字符相同:

>>> 'a' == 'a '
False

你需要去除它们:
for i in k:
    i = i.strip()  # <----
    if i not in profile_list:
        profile_list.append(i)

更新 如果列表项的顺序不重要,您可以使用set

profile_list = list(set(s.strip() for s in k))  # Using `set` with generator expression

profile_list = list({s.strip() for s in k})  # Using set comprehension

3

你的字符串末尾有多余的空格,请去掉这些空格。使用集合或列表推导式使你的代码更符合Python风格。如果你希望元素是唯一的,我建议你使用一个集合:

>>> st = [u'UI/UX Designer\xa0\u2013 Creative Head ', u'UX Designer ', u'UI/UX Designer\xa0\u2013 Creative Head', u'UX Designer']
>>> uniques = {elem.strip() for elem in st}
>>> uniques
set([u'UX Designer', u'UI/UX Designer\xa0\u2013 Creative Head'])

2

从输出结果来看,你使用的代码实际上是有效的。问题在于文本中有一个额外的空格:

[u'UI/UX Designer\xa0\u2013 Creative Head ', # Note the space here
u'UX Designer ', # and here
u'UI/UX Designer\xa0\u2013 Creative Head',
u'UX Designer'
]

你要做的就是使用 strip() 函数:
profile_list = []
k = soup.body.findAll(text=re.compile("UX Designer"))
for i in k:
    if i.strip() not in profile_list:
        profile_list.append(i.strip())
print profile_list

另一种方法,正如 @edwinskl 提到的那样,是从一开始就将其设置为 set()

profile_list = set()
k = soup.body.findAll(text=re.compile("UX Designer"))
for i in k:
    if i.strip() not in profile_list:
        profile_list.add(i.strip())
print profile_list

另一种方法(当我第一次看到您的问题时想到的)是在之后将其变为 "set":
profile_list = []
k = soup.body.findAll(text=re.compile("UX Designer"))
for i in k:
    profile_list.append(i.strip())
list(set(profile_list))
print profile_list

虽然它不如上面两个好。

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