Python中有效的方法从逗号分隔的字符串中删除元素

时间:2010-05-20 07:57:24

标签: python string pylons

我正在寻找一种最有效的方法,将元素添加到逗号分隔的字符串中,同时保持字母的字母顺序:

例如:

string = 'Apples, Bananas, Grapes, Oranges'
subtraction = 'Bananas'
result = 'Apples, Grapes, Oranges'

此外,还有一种方法可以在保持ID时执行此操作:

string = '1:Apples, 4:Bananas, 6:Grapes, 23:Oranges'
subtraction = '4:Bananas'
result = '1:Apples, 6:Grapes, 23:Oranges'

非常感谢示例代码。非常感谢你。

4 个答案:

答案 0 :(得分:5)

', '上的{p> Splitremove元素和join

答案 1 :(得分:1)

Matthew上面的评论是正确的方法,但是如果你确定,(逗号后跟一个空格)只发生 作为分隔符,那么像这样的东西就可以了

def remove(str, element):
    items = str.split(", ")
    items.remove(element)
    return ", ".join(items)

我不建议您使用字符串作为列表。它们是为不同的目的而设计的,遵循马修的建议是正确的。

答案 2 :(得分:1)

理想情况下,如:

input_str = '1:Apples, 4:Bananas, 6:Grapes, 23:Oranges'
removal_str = '4:Bananas'
sep = ", "

print sep.join(input_str.split(sep).remove(removal_str))

会奏效。但python不会从remove()返回新列表,所以你不能在一行上完成所有操作,并且需要临时变量等。类似的解决方案可以工作:

input_str = '1:Apples, 4:Bananas, 6:Grapes, 23:Oranges'
removal_str = '4:Bananas'
sep = ", "

print sep.join([ i for i in input_str.split(sep) if i != removal_str ])

但是,为了尽可能正确,假设您没有保证所有项目都有效,您需要验证每个项目是否符合给您的所有规范,即它们的格式是号:标识符。最简单的方法是使用re模块搜索特定的正则表达式格式,返回所有结果,并跳过与您想要的不匹配的结果。使用刻意紧凑的代码,您可以得到一个相当简短的解决方案,可以进行良好的验证:

def str_to_dictlist(inp_str):
    import re
    regexp = r"(?P<id>[0-9]+):(?P<name>[a-zA-Z0-9_]+)"
    return [ x.groups() for x in re.finditer(regexp, inp_str) ]

input_str = '1:Apples, 4:Bananas, 6:Grapes, 23:Oranges'
subtraction_str = "4:Bananas"
sep = ", "

input_items = str_to_dictlist(input_str)
removal_items = str_to_dictlist(subtraction_str)
final_items = [ "%s:%s" % (x,y) for x,y in input_items if (x,y) not in removal_items ]

print sep.join(final_items)

这还具有同时处理多个删除的优点。由于输入格式和删除格式非常相似,并且输入格式有多个项目,因此删除格式可能也需要支持它们 - 或者至少,获得该支持是有用的。

请注意,这样做(使用重新搜索)会很难检测到不会验证的项目;它会扫描任何有效的东西。作为一个黑客,你可以在输入中计算逗号并报告一些可能无法解析的警告:

if items_found < (num_commas + 1):
    print warning_str

这会警告没有空格的逗号。

要正确解析更复杂的输入字符串,您需要将其分解为单个标记,在解析时跟踪输入行和列,打印任何意外的错误,甚至可能处理回溯和图形构建等更复杂的内容像源代码一样的输入。对于那种东西,请查看pyparsing模块(这是第三方下载;它不带有python)。

答案 3 :(得分:0)

>>> import re
>>> re.sub("Bananas, |, Bananas$", "", "Apples, Bananas, Grapes, Oranges")
'Apples, Grapes, Oranges'

import re
strng = '1:Apples, 4:Bananas, 6:Grapes, 23:Oranges'
subtraction = '4:Bananas'
result = re.sub(subtraction + ", |, " + subtraction, "", strng)
print result

这适用于您的示例,但如果减法字符串可能包含正则表达式元字符(如[].*?{}\),则需要进行修改。

正如一位评论者指出的那样,这是一个低级字符串操作。它可能会起作用,但考虑到数据结构的方法应该更加可靠。分割逗号/空格是否足够,或者是否需要csv模块的健壮性取决于您期望的可能输入字符串。