Python从列表

时间:2016-10-25 19:21:40

标签: python string list character

基本上,我想从两个字符串中删除字符,就像它们两者中出现的那样多。例如,如果我们有两个字符串“cat”,“cats”,当我打印最终结果时,我会有“s”。 我做了以下几点:我有一个函数,它接受两个字符串并将它们转换为两个单独的列表,然后直接排序。我有一个循环,检查字符串的第一部分是否在第二部分,然后它删除了发生,但问题是,如果我使用字符串“猫”,“演员”我会得到“st”而不仅仅是“s”。我知道问题出在我的代码中。 我相信我必须遍历两个列表,但我找不到解决方案。我正在使用python 3 感谢您抽出宝贵时间。

def func1(arg1,arg2)
  l1=list(arg1)
  l1.sort()
  l2=list(arg2)
  l2.sort()
    for i in l1:
    if (l1[0]==l2[0]):
            del l2[0]

3 个答案:

答案 0 :(得分:1)

您可以将每个字符串转换为集合并使用symmetric_difference

def func1(arg1, arg2):
    diff = set(arg1).symmetric_difference(arg2)
    return ''.join(sorted(diff))
>>> func1('cat', 'cast')
's'

答案 1 :(得分:0)

您编写的代码的问题在于它取决于字符串中的位置。您正在检查arg1中给定索引处的字符是否与arg2中相同位置的字符相同。无论位置如何,您都要检查所有出现的角色。编写独立于位置的解决方案的方法可能是

def foo(arg1, arg2):
    new_string = arg2
    for char in set(arg1):
        new_string = new_string.replace(char, "")
    for char in set(arg2):
        new_string = new_string.replace(char, "")
    return new_string

根据所需的结果,可以使用每个字符串的集合的对称差异。那将是arg1或arg2中的元素,但不是两者中的元素。

>>> set("cat") ^ set("cast")
{"s"}
>>> set("hello") ^ set("world")
{'d', 'e', 'h', 'w', 'r'}

或者如果您想要常规差异,请使用arg2和arg1之间的差异。这将是arg2中的元素,不包括arg1中的元素。

>>> set("cast") - set("cat")
{'s'}
>>> set("world") - set("hello")
{'r', 'd', 'w'}

答案 2 :(得分:0)

这将检查较短字符串的所有值并删除重复项或添加缺失值以返回它们的差异。

我认为既定的方法不会抓住" catt" ^"猫" = [' t',' s']

def func1(arg1,arg2):

    l1, l2 = list(arg1), list(arg2)
    if len(l1) > len(l2):
        l2,l1 = l1,l2
    while l1: 
        val= l1.pop()
        if l2.count(val) > 0:
            l2.remove(val)
        else:
            l2.extend(val)
    return l2