2016-08-15 20 views
0

我有一个字符串,它有几千个字符长,并包含大约100 \n,在打印时将其分隔开。我删除了包含特定子字符串和某些单个字符的所有行。用临时列表修改字符串的pythonic方式

这部分已经完成,但我很好奇最大的方法是做什么,并假设我选择的方法是合理的,如果有合适的命名约定临时名单。

active_config = active_config.split('\n') 

for i, elem in enumerate(active_config): 
    # Delete entire line based off match 
    if "cmdStatus=" in elem or "<?xml" in elem: 
     active_config.remove(elem) 

    #Delete individual char based off match 
    elem = elem.replace("\r","") 
# Delete last line if it is '*' 
if active_config[-1] == "*": 
    del active_config[-1] 

active_config = '\n'.join(active_config) 

我选择覆盖串active_config作为一个列表,然后覆盖,作为一个字符串中删除某些内容后再次完成。

由于该列表仅用于删除几行和单个字符,并且从未在其他地方使用过,因此我有什么特殊的约定来称呼它?也许叫它active_config_listtemp_active_config甚至只是temp

+3

修改列表,而你遍历它是一个坏主意,因为它往往会抛弃你在名单中的位置。另外,'remove'是从列表中删除元素的非常缓慢的方式,因为它必须再次定位元素。建立一个新的列表,而不是从现有的列表中删除。 – user2357112

+1

另外,你不应该在列表中测试_every_行,看看它是否是最后一行,只是在循环之外做这些事情。你有'.join'回调。它应该是'separator_string.join(list_of_strings)' –

+0

@ PM2Ring,你是对的。感谢您指出了这一点。 –

回答

1

下面是使用filter对这类问题的一个Python的解决方案:

active_config = """this is an 
example which contains 
words like 
cmdStatus= 
cmdStatus2 
or other 
weird <?lxml 
tags 
""" 

lines = active_config.splitlines() 
tokens = ["cmdStatus=", "<?lxml"] 
print '\n'.join(filter(lambda x: not any(w in x for w in tokens), lines)) 
+0

啊是的,我知道lambda列表的理解,但经常忘记使用它! 并回答这个问题的其他部分。像''''这样的临时变量比我重复使用同一个var名称并将它重写两次的方法更可取? –

+0

@BrianC我编辑了我的代码,而不是使用split('\ n')我建议你使用splitlines()来代替。关于保留或重用var名称,嗯,我更愿意保留我原来的输入用于其他用途。除非你关心的是内存问题,这不太可能:) – BPL

+0

我在其他地方使用了原始输入变量,正如我所说的,我基本上会做'a =“some \ nstuff”'然后'a = a.split (“\ n”)',修改a的元素,然后'a =“\ n”.join(a)'。所以这里没有公约,只是偏好? –

1

一对夫妇列表解析会做到这一点:

active_config = active_config.split('\n') 

temp_list = [z for z in active_config if "cmdStatus=" in z or "<?xml" in z] 

if temp_list[-1] == "*": 
    temp_list = "\n".join([x.replace("\r", "") for x in temp_list[:-1]]) 

#Do whatever you need to do with temp_list here