【问题标题】:Check if string contains any elements from list检查字符串是否包含列表中的任何元素
【发布时间】:2015-01-20 14:06:32
【问题描述】:

查看下方以获得更好的解释 我在逐行读取的文件中有很长的项目列表,我想对其中包含特定字符串的所有项目进行排序。如果单词不包含排序中的任何元素,那么它将被添加到字典中。我怎么做?我在这个网站上阅读了一些其他情况,但我就是不明白......所以这可能是重复的,但我需要有人解释我如何做到这一点。 (是的,这些物品来自游戏 TF2)

item_list = ("Non-Tradable Ubersaw", "Screamin' Eagle", "'Non-Craftable Spy-cicle"

sort = ("Non-Tradable", "Non-Craftable") # The items that are not allowed
for word in item_list:
    if not sort in word:
        if word in items: # add to the dictionary
            items[word] += 1
        else:
            items[word] = 1

已经回答了,只是为了让问题更清楚。 我想对列表进行排序: item_list 并且我想通过创建一个数组来做到这一点: sort 所以它会检查 item_list 中的每个元素和检查元素中是否包含 sort 中的任何元素。如果没有,它会将元素添加到字典中。

【问题讨论】:

    标签: python list contain


    【解决方案1】:
    >>> item_list = ["Non-Tradable Ubersaw", "Screamin' Eagle", "'Non-Craftable Spy-cicle"]
    >>> not_allowed = {"Non-Tradable", "Non-Craftable"}
    

    您可以使用any 的列表推导来检查当前元素中是否有任何不允许的子字符串

    >>> filtered = [i for i in item_list if not any(stop in i for stop in not_allowed)]
    >>> filtered
    ["Screamin' Eagle"]
    

    【讨论】:

    • 为什么要设置 not_allowed?
    • @PadraicCunningham 因为所有元素都是唯一的(如果存在重复,则检查两次是没有意义的)并且in 操作对于 setlist 更快,如果项目数变大。
    • 但是你没有使用你正在迭代集合?如果 OP 创建过滤器项目,则不会出现重复
    • @PadraicCunningham .... 哦。看看我在喝咖啡前打字会发生什么?是的,你是对的,在这种情况下没关系,它可能是 listsettuple
    • @Cyber​​,可能更糟,我不能煮咖啡,因为我有坐骨神经痛并且暂时失去了我的腿!
    【解决方案2】:

    您需要检查排序中的每个项目是否不在每个单词中,不要将元组与每个单词进行比较 if not sort in word 正在做的事情:

    from collections import defaultdict
    
    items = defaultdict(int)
    for word in item_list:
        if not any(ele in  word for ele in srt):
            items[word] += 1
    

    值得添加,因为它实际上回答了所提出的问题。正如@JonClements 建议的那样,只需使用 Counter dict:

    from collections import Counter
    items = Counter(item for item in item_list if not any(word in item for word in sort)) 
    

    使用defaultdict 无需检查if word in items

    【讨论】:

    • 为什么不:items = Counter(item for item in item_list if not any(word in item for word in sort))
    • @JonClements,我正打算做这样的事情,但基于 OP 接受的答案这一事实,这个问题现在没有任何意义
    【解决方案3】:

    我知道您使用的是 python,但如果文件真的很大,一个好的优化是使用一些较低级别的命令,例如 bash。就像这条单线一样简单:

    $ grep "text you are searching" my_file.txt | sort
    

    当然,如果需要,可以使用subprocess 模块从 python 执行此 bash 代码。

    同样,这仅在文件很大且性能优化很重要的情况下才值得。 bash 命令将比简单的 python 循环更快地完成这项工作。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2017-11-20
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2021-10-31
      • 2011-12-23
      • 1970-01-01
      相关资源
      最近更新 更多