【问题标题】:Searching a list of strings for all items of a string在字符串列表中搜索字符串的所有项
【发布时间】:2016-03-19 10:39:32
【问题描述】:

我正在尝试确定 search_string 的所有元素是否都存在于列表look_here_string 中的一个字符串中。出于效率原因,如果一个元素不存在,则从列表中删除该单词。

search_string = '1abc'
look_here_string = ['dedakloera', 'tuau', '1abcdefg']
x = 0
counter = 0

for item in search_string:
    item = search_string[counter]
    #print item, search_string, look_here_string[x]
    if not item in look_here_string[x]:
        print item, 'not in', look_here_string[x]
        look_here_string.remove(look_here_string[x])
        counter = 0
    else:
        print item, 'in', look_here_string[x]
        counter +=1

这是我正在寻找的输出:

1 not in dedakloera    
1 not in tuau          
1 in 1abcdefg          
a in 1abcdefg          
b in 1abcdefg          
c in 1abcdefg

这是我得到的输出:

1 not in dedakloera    #correct
1 not in tuau          #correct
1 in 1abcdefg          #correct
a in 1abcdefg          #correct

脚本似乎过早停止,但我无法弄清楚我的代码有什么问题。非常感谢您的帮助!

【问题讨论】:

  • 因为你使用了for item in search_string:,它只会迭代n = len(search_string),因此只打印4次输出。
  • 我该如何解决这个问题?

标签: python string for-loop find iteration


【解决方案1】:

更简单的方法是在外循环中遍历look_here_string

search_string = '1abc'
look_here_string = ['dedakloera', 'tuau', '1abcdefg']
ind_to_remove = []
for i,s in enumerate(look_here_string):
    for e in search_string:
        if not e in s:
            ind_to_remove.append(i)
            print e, 'not in', s
            break
        else:
            print e, 'in', s
for i in ind_to_remove[::-1]:
    del look_here_string[i]

【讨论】:

  • 感谢您的输入:如果我正确理解您的代码,您首先构建一个缺失字符串的索引列表,然后根据此列表从look_here_string 中删除项目。这帮助很大!
  • @Johannes Schwaninger 不客气)是的,您完全理解。
【解决方案2】:

您可以使用“all”内置函数和列表推导更简洁地编写此代码:

>>> search_string = '1abc'
>>> look_here_string = ['dedakloera', 'tuau', '1abcdefg']
>>> [string for string in look_here_string 
            if all(char in string for char in search_string)]

这会创建一个新列表,但它会自动过滤无效字符串。

【讨论】:

  • 非常简洁的代码! - 感谢您建议使用“全部”
猜你喜欢
  • 1970-01-01
  • 2011-03-22
  • 2020-03-12
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多