3 回答
TA贡献1862条经验 获得超6个赞
列表理解的解决方案:
list_strings=["abc-df-r-e","abc--daa-q","-ab-c-aub-","cbac-a-c--"]
list_positions=[2,0,4,7]
list_strings = [s for s in list_strings if not any(ch not in 'abc-' and i in list_positions for i, ch in enumerate(s))]
print(list_strings)
印刷:
['abc--daa-q', 'cbac-a-c--']
编辑:感谢@David Wierichs,一个更快的解决方案:
list_strings = [s for s in list_strings if not any(s[i] not in 'abc-' for i in list_positions)]
TA贡献1863条经验 获得超2个赞
一个好的 pythonic 方法是使用“filter”函数,它可以使用特定的、用户定义的过滤器从列表中过滤出来。为此,您需要该函数知道 list_approved 以便它可以相应地过滤掉,
为此,您可以使用包装器或“部分”函数。出于简单的原因,我们将使用来自 functools 的 partial。此函数允许在不同时间发送函数参数,有关更多信息,请查看:
https://docs.python.org/2/library/functools.html#functools.partial
此代码确实根据您的规则过滤掉
from functools import partial
list_strings=["abc-df-r-e","abc--daa-q","-ab-c-aub-","cbac-a-c--"]
list_positions=[2,0,4,7]
list_approved=["a","b","c","-"]
def filter_out_according_to_position(list_positions, list_approved, currnet_string):
return all([currnet_string[i] in list_approved for i in list_positions])
new_list = list(filter(partial(filter_out_according_to_position, list_positions, list_approved), list_strings))
print(new_list)
希望有所帮助
TA贡献1818条经验 获得超7个赞
在列表本身上迭代时,您可能不会删除元素,因为这会破坏索引并且您不会检查最后的每个元素。使用您的代码,"cbdc-a-c--"
例如未经过测试。
使用有意义的名字
直接使用变量
letter
,而不是word[idx_letter]
结合 2 个如果
到达禁止字母时使用 a
break
停止内循环
迭代list(list_strings)
,这会复制列表,然后您可以list_strings
毫无问题地从中删除
for word in list(list_strings):
for idx_letter, letter in enumerate(word):
if idx_letter in list_positions and letter not in list_approved:
list_strings.remove(word)
break
print(list_strings)
另一个要看的是:使用列表理解保留匹配的词
list_strings = [word for word in list_strings
if not any(letter not in list_approved and i in list_positions for i, letter in enumerate(word))]
添加回答
举报