我正在运行一个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(),但它也没有在这里工作。我该怎么做才能添加唯一的项目?
更新 - 谢谢你的答案,我在这里犯了一个愚蠢的错误,列表中的两个重复单词在这里有额外的空间应该删除。所有答案都是正确的,所以挑选最老的。
答案 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
虽然不如上面两个那么好。