级联FOR循环输出有一个更好的python 3方式

时间:2018-01-23 21:07:33

标签: python string for-loop nested-loops cascade

现在,我有一个单词,如果找不到这个单词,我会用更大的字符串搜索,然后我将单词插入更大的字符串中。第一个FOR循环的输出级联为第二个FOR循环。

这项工作还可以,有一两个,但如果我有100或1000的搜索,每次有更好的python 3方式这样做会很痛苦吗?

从示例中我可以看到我在第一个字符串星期一寻找星期一那么它只是跳过第二个字符串没有星期一所以它添加了星期一。我会在那时有一个新的列表。所以我将第一个循环的输出放入第二个循环的输入以更新输入。

示例:

Input: - addstring_sign = ["Monday was a snowing day", "Wednesday no snow"]

string_test1 = [] string_test2 = [] dictlines1 = ("Monday")

for loopblock in (addstring_sign):

    if addstring_sign.count(dictlines1) < 1:
       string_test1.append(loopblock[:len(loopblock)] + dictlines1 +'\n'+loopblock[len(loopblock):])

    else:
       string_test2.append(loopblock)
    addstring_sign1 = string_test1 + string_test2

OutPut of addstring_sign1 = ["Monday was a snowing day", "Wednesday no snow Monday"]

string_test3 = [] string_test4 = [] dictlines2 = ("Tuesday")

for loopblock2 in (addstring_sign1):

    if addstring_sign.count(dictlines2) < 1:
       string_test3.append(loopblock2[:len(loopblock2)] + dictlines2 +'\n'+loopblock2[len(loopblock2):])

    else:
       string_test4.append(loopblock)
    addstring_sign2 = string_test3 + string_test4`

output of addstring_sign2 = ["Monday was a snowing day Tuesday", "Wednesday no snow Monday Tuesday"]

我迷失了如何提高效率。

2 个答案:

答案 0 :(得分:1)

如果不出意外,我认为以下方法比您目前所做的更清晰,而且可能更快(我需要一些时间来设置正确的测试用例,很快就会添加)。

addstring_sign = ["Monday was a snowing day", "Wednesday no snow"]
dictlines = ['Monday', 'Tuesday']

string_test1 = []
for string in addstring_sign:
    missing_strings = ' '.join([item for item in dictlines if item not in string])
    string_test1.append('{} {}'.format(string, missing_strings))

# Or a list comprehension for the same thing, probably not much faster
string_test2 = ['{} {}'.format(string, 
                ' '.join([item for item in dictlines if item not in string])) 
                for string in addstring_sign]

接下来要做的就是将dictlines转换为set以解决更大的问题。这可以通过以下方式完成:

dictlines = set(dictlines)

这将为您提供O(1)查找 - 随着dictlines的增长,这将变得越来越重要。我努力将你现有的代码变成我可以在更大规模上测试但却无法进行测试的方法。但是,你可以看到,即使有这个小例子,没有set(这里没什么区别),我的初始方法比你现有的方法更快:

%timeit my_for_loop(addstring_sign, dictlines)
1.53 µs ± 4.08 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit your_loop(addstring_sign, dictlines)
2.13 µs ± 8.69 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

答案 1 :(得分:0)

<强> TLDR;

for word in strings:
    sentences = [line if word in line else line + ' ' + word for line in sentences]

因此,您将获得句子的列表,您需要检查其中是否包含字符串。当其中一个没有时,你想将字符串附加到句子中。

让我们先看一下代码的第二行,并考虑一下只有一个单词要搜索和追加的情况。这个列表理解遍历你的句子列表:

  1. 检查字符串是否在句子中
  2. 如果字符串不在句子
  3. 中,则附加字符串

    在迭代结束时,它会重新构建列表并将其分配回原始列表。

    第一行代码而不是简单地为您要搜索和追加的每个单词重复此过程。