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

Python如何高效地查找具有特定元素的数组,python,python-3.x,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:

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

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

简单的一行是:

result = [lst for lst in [arrayA, arrayB, arrayC, arrayD] if givenString in lst]
或者,如果您更喜欢功能性更强的样式:

result = filter(lambda lst: givenString in lst, [arrayA, arrayB, arrayC, arrayD])
请注意,这两个选项都没有给出列表的名称。不过,您不需要知道这一点。

数组名称

使用
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']

在列表中查找不是很有效;一套要好得多

让我们将您的数据定义为

data = {    # a dict of sets
    "a": {1, 2, 3, 4, 5},
    "b": {3, 4, 5},
    "c": {1, 3, 5},
    "d": {7}
}
from collections import defaultdict

lookup = defaultdict(set)
for label,values in data.items():
    for v in values:
        lookup[v].add(label)
然后我们可以像这样搜索

search_for = 3   # for example
in_which = {label for label,values in data.items() if search_for in values}
# -> in_which = {'a', 'b', 'c'}
如果您打算经常重复这一点,那么像这样预处理您的数据可能是值得的

data = {    # a dict of sets
    "a": {1, 2, 3, 4, 5},
    "b": {3, 4, 5},
    "c": {1, 3, 5},
    "d": {7}
}
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'}

示例代码中没有字符串或数组。我看到了int和list,但是…除了检查所有元素直到找到目标之外,没有什么其他的事情可以做。但是,您可以使用for循环,而不是手动重复if块。可能一个
for
-循环可能会使其短路:
for[arrayA,arrayB,arrayC,arrayD]:如果在数组中进行安装:foundArrays.append(array)
@AdamSmith,很抱歉示例和解释不清楚。我已经编辑了我的问题。我不认为后者比前者更有功能。他不想要数组的名称而不是数组本身吗?当然,无论如何,试图这样做是一个非常糟糕的主意。但是也许可以为OP添加一些指导?@ChristianDean如果他想知道数组的名称,他不能比他的代码更简单。更明确地说:他不应该想要数组的名称,如果他想要,他应该尝试另一种方法。@AdamSmith是的,我知道。我更新了我的原始评论,以反映我对此事的立场。@juanpa.arrivillaga
filter
map
reduce
被认为是一种功能性方法,而不是通常的命令式列表理解和for循环。如果您知道
eval()
是邪恶的,那么为什么发布这个答案,除了邪恶之外,对上一个答案没有任何补充?因为我们都是成年人。@Bothwell在第二段代码中,项目应该是值吗?