【问题标题】:Efficiently find strings in list of lists of strings (Python)有效地在字符串列表中查找字符串(Python)
【发布时间】:2021-07-07 15:28:39
【问题描述】:

我正在寻找一种有效的方法来在字符串列表的列表中查找不同的字符串并返回它们的索引。代码如下:

inp = [ 'ans1', 'ans2', 'ans3' ]
output = [ [ 'aaa', 'ans1', 'bbb', 'ccc', 'ans2', 'ddd' ],
           [ 'bbb', 'aaa', 'ans2', 'ddd', 'ans1', 'aaa' ],
           [ 'ddd', 'ccc', 'ans2', 'ans1', 'aaa', 'bbb' ] ]

# expected result
# result = [ [ 1, 4, 3 ], [ 4, 2, 2 ], [ -1, -1, -1 ] ]

结果中报告的是inp 列表中每个字符串在output 列表中的位置索引。例如,ans2 位于第一个子列表中的索引 4、第二个子列表中的索引 2 和第三个子列表中的索引 2。 ans1 也是如此。但是,ans3 不会出现在任何子列表中,因此返回的索引是 -1

我正在寻找一种高效的方法来进行这个计算(可能是并行的?),同时避免经典的 for 循环,这显然可以完成.

一些注意事项:

  • output 的形状等于[ len( inp ), L ],其中L 是字典的大小。在这种情况下L = 5

【问题讨论】:

标签: python string list performance find


【解决方案1】:

您可以尝试列表理解:

result = [[o.index(s) if s in o else -1 for o in output] for s in inp]
print(result) # [[1, 4, 3], [4, 2, 2], [-1, -1, -1]]

更新:

此外,将 -1 存储为字符串的索引可能不是最好的主意,这些字符串不会出现在输出列表中。 -1 是 Python 中的有效索引,如果您打算对存储在结果中的索引执行某些操作,这可能会在未来导致错误。

【讨论】:

  • @not_speshal 同意,使用变量“input”会导致错误,已在帖子中修复
  • 它实际上不会导致错误。这只是不好的做法。
  • 小修正:// 应该是#
  • 是否有机会提高性能并可能为inp中的每个不同字符串并行计算?
  • 对于像这样的简单事情,列表推导的效率通常不比常规循环高或低。在这种情况下,它的效率较低,因为if s in o 已经遍历列表一次,而o.index(s) 再次遍历。
【解决方案2】:

您可以先创建字典索引以加快搜索速度:

inp = ["ans1", "ans2", "ans3"]
output = [
    ["aaa", "ans1", "bbb", "ccc", "ans2", "ddd"],
    ["bbb", "aaa", "ans2", "ddd", "ans1", "aaa"],
    ["ddd", "ccc", "ans2", "ans1", "aaa", "bbb"],
]

tmp = [{v: i for i, v in enumerate(subl)} for subl in output]

result = [[d.get(i, -1) for d in tmp] for i in inp]
print(result)

打印:

[[1, 4, 3], [4, 2, 2], [-1, -1, -1]]

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 2023-04-03
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2015-08-03
    • 2012-05-16
    相关资源
    最近更新 更多