我正在寻找一种最有效的方法,将元素添加到逗号分隔的字符串中,同时保持字母的字母顺序:
例如:
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'
非常感谢示例代码。非常感谢你。
答案 0 :(得分:5)
答案 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
模块的健壮性取决于您期望的可能输入字符串。