【问题标题】:Faster way to remove a dictionary of phrase from a list of string using Python使用 Python 从字符串列表中删除短语字典的更快方法
【发布时间】:2016-12-13 16:56:07
【问题描述】:

我必须使用 Python 从字符串列表中删除短语字典

字符串 L1 的列表。示例:L1 = ['Programmer New York', 'Programmer San Francisco']

短语 L2 的字典(它们都不止一个单词)。示例:L2={'New York', 'San Francisco'}

预期的输出是,对于 L1 中的每个字符串,删除 L2 中存在的子字符串。所以输出将是res=['Programmer', 'Programmer']

def foo(L1, L2):
    res = []
    print len(L1)
    for i in L1:
        for j in L2:
            if j in i:
                i = i.replace(j, "")
        res.append(i)
    return res

我当前的程序是一个蛮力双 for 循环。但是有可能提高性能吗?尤其是当 L1 尺寸非常大时。

【问题讨论】:

  • 如果您的代码有效并且您想要审查/优化,我将投票关闭这个问题作为题外话,它属于 codereview.stackexchange.com
  • @Two-BitAlchemist 这看起来像示例代码,因此与代码审查无关。不过,真正的工作代码在那里会很好。
  • @xuanyue 我不知道你为什么认为这“只是我的意见”(或者为什么你不认为你所说的只是你的),但这里有一个非常相关的元数据问题:meta.stackoverflow.com/questions/277565/… --> 高度评价的评论立即指向 CR。并且来自链接的欺骗答案(强调我的):“CodeReview:您的代码有效,但您很想听听它如何更好地工作
  • 另外,我现在不打算追查 Meta 链接,但随着网站的发展,规则多年来发生了变化,因此引用(或暗示存在)与您类似的高度赞成的问题未关闭的则显示审核失败,未显示规则与实际不同。
  • @Two-BitAlchemist 不过,您指出 Code Review 存在一个主要问题。函数名称为foo。我怀疑这是一个 MCVE,它们是 off-topic at Code Review。如果提供了实际代码,它可以工作。

标签: python


【解决方案1】:

尝试使用 map() 和 re,

import re
res = map(lambda i, j: re.sub(" "+i, '', j), L2, L1)

i 之前的双引号是为了消除程序员后面的尾随空格。

return list(res)

附:仅当您使用 Python 3 时才需要显式返回列表。让我知道这是否能提高您的速度。

【讨论】:

    【解决方案2】:

    您可以使用列表推导来这样做:

    l1 = ['Programmer New York', 'Programmer San Francisco']
    l2=['New York', 'San Francisco']
    a=[x.split(y) for x in l1 for y in l2 if y in x]
    res=["".join(x) for x in a]
    

    【讨论】:

    • 是的,对我来说,这只是一种更干净的方式..但复杂性仍然相同..可能我应该强调我正在寻找更好的算法..我也怀疑使用 split会比替换有更好的性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多