仅向python列表添加唯一项?

时间:2016-07-02 13:34:15

标签: python python-2.7 web-scraping beautifulsoup

我正在运行一个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(),但它也没有在这里工作。我该怎么做才能添加唯一的项目?

更新 - 谢谢你的答案,我在这里犯了一个愚蠢的错误,列表中的两个重复单词在这里有额外的空间应该删除。所有答案都是正确的,所以挑选最老的。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

字符串末尾有一个尾随空格,你应该删除多余的空格。使用set或list comprehensions来编写Pythonic代码。如果您希望元素是唯一的,我还建议使用集合:

>>> 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 :(得分: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

虽然不如上面两个那么好。