Python如何有效地查找具有特定元素的数组

时间:2017-08-16 00:55:01

标签: python python-3.x

给定列表(列表可以包含另一个列表中的元素)和字符串,我想查找包含给定字符串的列表的所有名称。

简单地说,我可以使用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

3 个答案:

答案 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']