给定列表(列表可以包含另一个列表中的元素)和字符串,我想查找包含给定字符串的列表的所有名称。
简单地说,我可以使用if语句浏览所有列表,但我觉得有更有效的方法。
任何建议和意见将不胜感激。谢谢。
简单方法示例我想出了
arrayA = ['1','2','3','4','5']
arrayB = ['3','4','5']
arrayC = ['1','3','5']
arrayD = ['7']
foundArrays = []
if givenString in arrayA:
foundArrays.append('arrayA')
if givenString in arrayB:
foundArrays.append('arrayB')
if givenString in arrayC:
foundArrays.append('arrayC')
if givenString in arrayD:
foundArrays.append('arrayD')
return foundArrays
答案 0 :(得分:1)
列表中的查找效率不高;一套好多了。
让我们定义您的数据,如
data = { # a dict of sets
"a": {1, 2, 3, 4, 5},
"b": {3, 4, 5},
"c": {1, 3, 5},
"d": {7}
}
然后我们可以搜索
search_for = 3 # for example
in_which = {label for label,values in data.items() if search_for in values}
# -> in_which = {'a', 'b', 'c'}
如果您要经常重复此操作,可能需要预处理您的数据,例如
from collections import defaultdict
lookup = defaultdict(set)
for label,values in data.items():
for v in values:
lookup[v].add(label)
现在你可以简单地
in_which = lookup[search_for] # -> {'a', 'b', 'c'}
答案 1 :(得分:0)
简单的单行是:
result = [lst for lst in [arrayA, arrayB, arrayC, arrayD] if givenString in lst]
或者如果您更喜欢更实用的风格:
result = filter(lambda lst: givenString in lst, [arrayA, arrayB, arrayC, arrayD])
请注意,这些都不会为您提供列表的名称。但是,你不应该知道这一点。
答案 2 :(得分:0)
数组名称?
使用eval()
尝试使用此类似的内容但使用eval()
是邪恶的
arrayA = [1,2,3,4,5,'x']
arrayB = [3,4,5]
arrayC = [1,3,5]
arrayD = [7,'x']
foundArrays = []
array_names = ['arrayA', 'arrayB', 'arrayC', 'arrayD']
givenString = 'x'
result = [arr for arr in array_names if givenString in eval(arr)]
print result
['arrayA', 'arrayD']