Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有方法以不同方式编辑列表中相同子字符串的两个实例?_Python - Fatal编程技术网

Python 是否有方法以不同方式编辑列表中相同子字符串的两个实例?

Python 是否有方法以不同方式编辑列表中相同子字符串的两个实例?,python,Python,我有一个包含两行相同内容的大列表。对于该字符串的第一次出现,我希望进行某些编辑,对于第二次出现,我希望进行不同的编辑 我尝试过使用状态函数以及一些正则表达式,但没有工作。我希望编辑一个列表,其形式如下: lots of words lots of words Contingency 17 - Reno - Vegas more words Contingency 17 - Reno - Vegas still more 我知道这不是pythonic,但我正在寻找一些基本上可以做到这一点的代

我有一个包含两行相同内容的大列表。对于该字符串的第一次出现,我希望进行某些编辑,对于第二次出现,我希望进行不同的编辑

我尝试过使用状态函数以及一些正则表达式,但没有工作。我希望编辑一个列表,其形式如下:

lots of words
lots of words

Contingency 17 - Reno - Vegas
more words

Contingency 17 - Reno - Vegas
still more
我知道这不是pythonic,但我正在寻找一些基本上可以做到这一点的代码:

for line in file.readlines()
    if first.("Contingency 17") in line:
        #do stuff (I know how to do this section)
    elif next.("Contingency") in line:
        #do other stuff (I know this as well)
    else:
        file_out.write(line)
希望这能在一个大的文本文件中以不同的方式编辑字符串的第一个和下一个实例。我需要帮助选择两行以不同的方式编辑。这方面的一个示例输出是:

lots of words
lots of words

Contingency 20 - Reno - Carson City
more words

Contingency 25 - Carson City - Vegas
still more
尝试:

这里最大的问题是你必须知道你的模式有多少次出现。如果您不关心这一点,并且只想对第一次出现应用一个函数,对所有后续出现应用另一个函数,请使用状态标志:

def fun_to_apply_first(line):
    return line.upper()

def fun_to_apply_rest(line):
    return 2*line

list_of_lines = ['a', 'b', 'c', 'b', 'd', 'b', 'b']

pattern = 'b'
is_first = True
new_list = []
for line in list_of_lines:
    value = line
    if line == pattern:
        value = fun_to_apply_first(line) if is_first else fun_to_apply_rest(line)
    new_list.append(value)

print(list(zip(list_of_lines, new_list)))

>>> [('a', 'a'), ('b', 'B'), ('c', 'c'), ('b', 'B'), ('d', 'd'), ('b', 'B'), ('b', 'B')]
显然,结尾没有print()语句。这是非常脆弱的,并且会有很多模式的繁琐,所以你可以考虑函数的查找字典:

lookup_fun_dict = {'b': [first_fun, second_fun], 'c': [first_fun, third_fun]}
如果操作简单,我也可能使用lambdas而不是函数

这是非常脆弱的,我相信其他人会想出一个优雅的解决方案。如果出现了大量的
模式
,并且对其应用的操作非常昂贵,则可以使用静态值替换
模式
,或者至少将其记忆

试试看:

这里最大的问题是你必须知道你的模式有多少次出现。如果您不关心这一点,并且只想对第一次出现应用一个函数,对所有后续出现应用另一个函数,请使用状态标志:

def fun_to_apply_first(line):
    return line.upper()

def fun_to_apply_rest(line):
    return 2*line

list_of_lines = ['a', 'b', 'c', 'b', 'd', 'b', 'b']

pattern = 'b'
is_first = True
new_list = []
for line in list_of_lines:
    value = line
    if line == pattern:
        value = fun_to_apply_first(line) if is_first else fun_to_apply_rest(line)
    new_list.append(value)

print(list(zip(list_of_lines, new_list)))

>>> [('a', 'a'), ('b', 'B'), ('c', 'c'), ('b', 'B'), ('d', 'd'), ('b', 'B'), ('b', 'B')]
显然,结尾没有print()语句。这是非常脆弱的,并且会有很多模式的繁琐,所以你可以考虑函数的查找字典:

lookup_fun_dict = {'b': [first_fun, second_fun], 'c': [first_fun, third_fun]}
如果操作简单,我也可能使用lambdas而不是函数


这是非常脆弱的,我相信其他人会想出一个优雅的解决方案。如果出现了大量的
模式
,并且对其应用的操作非常昂贵,则可以使用静态值替换
模式
,或者至少将其记忆

你能把这个问题说得更具体一些吗?发布一个实际列表的示例输入和一个预期输出?我已经添加了更多信息。谢谢你的评论。值得注意的是,我知道如何编辑这些行,但在进行不同的编辑时遇到了困难。现在,两行代码都改为应急20-雷诺-卡森城您的问题不太清楚。你是说你有一个字符串列表,但我看到的任何地方都有一个或多个字符串。然后突然在代码中从文件中读取。尝试更准确地定义问题的输入和输出。在你的代码中,
第一个
下一个
应该代表什么?你能更具体地说明这个问题吗?发布一个实际列表的示例输入和一个预期输出?我添加了更多信息。谢谢你的评论。值得注意的是,我知道如何编辑这些行,但在进行不同的编辑时遇到了困难。现在,两行代码都改为应急20-雷诺-卡森城您的问题不太清楚。你是说你有一个字符串列表,但我看到的任何地方都有一个或多个字符串。然后突然在代码中从文件中读取。尝试更准确地定义问题的输入和输出。在您的代码中,
first
next
应该代表什么?您列出的第一个选项似乎运行良好。非常感谢。没问题。正如我所说,这是脆弱的。我不会在生产代码中使用它-这里有很多陷阱。如果您耗尽了函数列表,并遇到另一个
模式的实例,这将中断。它也是一只需要维护的熊。然而,如果这是一个小项目或一次性的事情,我认为它会很好。应该只有2个模式最大。是的,这是我的第一个主要编码项目,所以我知道我将不得不完善它一点,一旦我得到一切工作。还有一个问题要解决!谢谢您的意见。您列出的第一个选项似乎运行良好。非常感谢。没问题。正如我所说,这是脆弱的。我不会在生产代码中使用它-这里有很多陷阱。如果您耗尽了函数列表,并遇到另一个
模式的实例,这将中断。它也是一只需要维护的熊。然而,如果这是一个小项目或一次性的事情,我认为它会很好。应该只有2个模式最大。是的,这是我的第一个主要编码项目,所以我知道我将不得不完善它一点,一旦我得到一切工作。还有一个问题要解决!谢谢你的意见。