【问题标题】:Appending only unique items to python list?仅将唯一项目附加到python列表?
【发布时间】:2016-11-04 18:30:43
【问题描述】:

我正在运行一个 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 循环中添加项目?
  • 我试过用一套,也没用。

标签: python python-2.7 web-scraping beautifulsoup


【解决方案1】:

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

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

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

你需要剥离它们:

for i in k:
    i = i.strip()  # <----
    if i not in profile_list:
        profile_list.append(i)

UPDATE如果列表项的顺序不重要,可以使用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

【讨论】:

    【解决方案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
    

    虽然不如上面两个。

    【讨论】:

      【解决方案3】:

      字符串末尾有一个尾随空格,您应该去掉多余的空格。使用集合或列表推导使您的代码 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'])
      

      【讨论】:

        猜你喜欢
        • 2012-11-09
        • 2012-07-24
        • 1970-01-01
        • 2016-03-09
        • 2013-08-07
        • 1970-01-01
        • 2011-05-15
        • 2019-03-13
        • 1970-01-01
        相关资源
        最近更新 更多