【问题标题】:Similar Character's in two strings, return all similar characters (no repetitive characters) problemsetquestion in Python两个字符串中的相似字符,在Python中返回所有相似字符(没有重复字符)问题集问题
【发布时间】:2012-11-06 17:26:09
【问题描述】:

在此之前,我已经搜索过解决此问题的方法,但似乎还没有。因此,我目前正在尝试通过运行http://singpath.appspot.com 上的 Python“路径”来自学 Python,但遇到了一个我不知道如何解决的问题。我尝试了多种不同的方法来解决它,但不断提出不同的错误结果。任何提示/帮助都会很壮观!提前致谢!

问题:

比较字符串

创建一个接受两个字符串输入的函数 并返回一个包含所有出现的字符的字符串 在两个输入中。结果不应有任何重复和 应按排序顺序列出。您可能想使用 字符串模块中的变量小写,以便您拥有所有 字母顺序。

我当前的代码:

def in_both(s1, s2):
    s1 = s1.lower()
    s2 = s2.lower()
    
    l1=list(''.join(s1.split()))
    l2=list(''.join(s2.split()))
    
    same = ''
    
    for i in l1:
        if i in l2:
            
            same = ''.join(i)
    
    return same

例子:

call: in_both('apple','orange') recieved: 'e' expected: 'ae'

如您所见,它只收集了一个相似的字符。有什么建议?我尝试了几种不同的方法,但我不确定从这里去哪里!请帮忙!

附:我从一个类似的问题中得到了列表的想法:Python Function to return a list of common letters in first and last names

我了解它是如何工作的,问题是我必须同时返回一个包含所有比较的字符串。感谢“狼”提供角色列表的想法。

【问题讨论】:

  • 不确定''.join(s2.split()) 的用途。删除空格似乎不是问题
  • 你必须使用类似的东西吗?你不能只做''.join(sorted(set(string1).intersection(string2))) 吗? (减去任何套管问题)
  • @JonClements 正如我所说“我从位于此处的类似问题中得到列表的想法:Python 函数返回名字和姓氏中常用字母的列表”我仍然是编程新手,但我了解该代码以知道它可以使列表正常工作。感谢您指出这种新的、更简单的做事方法。我学得越多越好!

标签: python python-3.x


【解决方案1】:

试试这个:

def in_both(s1,s2):
       l1 =[]
       l2 = []
       l1= list(s1.lower())
       l2= list(s2.lower())
       s = [i for i in l1 if i in l2]
       same = list(set(''.join(s)))
       return same

【讨论】:

  • 这是行不通的,因为它会有相同相似字符的副本(假设“罂粟”和“菠萝”中有多个相同的字符。这就是为什么我使用多个 if 和一个以非 Pythonic 的编码方式循环:P 感谢您的输入!
  • 对不起 Winkleson,是我的错误没有正确阅读您的问题吗?您是对的。我为对此代码感兴趣的人做了一些调整。谢谢,再次对不方便的代码表示歉意。
  • 没问题先生 :) 非常感谢任何帮助,并且很难从我的句子中扣除信息 XD 感谢您的帮助!
【解决方案2】:

首先感谢所有帮助我解决问题的人!我输入的最终解决方案如下。它可能不是很pythonic,但它完成了工作:)如果我以后有时间我会回来重新审视解决方案!总之谢谢你的建议!

代码:


def in_both(s1, s2):
    s1 = s1.lower()
    s2 = s2.lower()

    l1=list(''.join(s1.split()))
    l2=list(''.join(s2.split()))

    same = []

    for i in l1:
        if i in l2:            
            if i not in same:
                same += i
                same = sorted(same)
                same = ''.join(same)

    return same

【讨论】:

    【解决方案3】:

    您可以通过将任何字符串变成一个集合来获取任何字符串中的唯一字符。 您可以使用intersection 获得两组的交集。 并且你可以对结果进行排序,返回一个列表。

    def in_both(s1, s2):
        s1 = s1.lower()
        s2 = s2.lower()
        s1_chars = set(s1)
        s2_chars = set(s2)
        result = sorted(s1_chars.intersection(s2_chars))
        return result
    

    【讨论】:

    • 该代码比我的要干净得多:P 我想我最好早点研究一下 set() 。感谢您的解决方案!附:一个问题是它应该返回一个字符串,但可以通过 ''.join(string) 轻松克服,对吧?
    • 请注意,set.intersection 需要一个可迭代对象,因此 s2_chars 不必是一个集合。
    • @Steve K Great XD 感谢您向我介绍 set()!
    • @Jon Clements 我真的需要学习 set() :) 感谢您的意见!
    【解决方案4】:

    你可以先转换成字符集,然后找到交集

    str1 = 'apple'
    str2 = 'orange'
    print list(str1)
    
    set1 = set(list(str1))
    set2 = set(list(str2))
    setout = set1 & set2
    
    print setout
    myres = ''.join(setout)
    print myres
    

    以上代码的输出

    kkiller-machine:Eclipse$ python unique.letter.py

    ['a', 'p', 'p', 'l', 'e']
    set(['a', 'e'])
    ae
    

    【讨论】:

    • 感谢您提出另一种解决方法:P 我没有使用 set(),但我相信我将来会学会使用它!
    【解决方案5】:

    您不会在每个循环上附加到变量“send”,而是从头开始设置。我想你想换行

    same = ''.join(i)
    

    到:

    same += i
    

    【讨论】:

    • 啊啊啊我是个笨蛋!你的权利我一定忘记了加号。但是,当我使用 '+=' 运行它时,它会将相同的相似字符添加到变量中:P 没有什么是快速的 if 语句无法修复的 :) 感谢您指出我明显的(和令人尴尬的)语法错误!
    • @Winkleson:你意识到''.join(i),其中i是一个字符串,和i一样吗?
    • @Eric 当然是你的权利。我只是拿了他的代码,并没有考虑太多关于它的那部分。
    • @Eric 是的,我正在玩很多代码,这可能与早期的某些类型传输有关,并试图解决一些没有积极结果的类型错误:P
    • @Winkleson 不是追加到字符串,而是追加到列表(首先看起来更自然)。然后你可以用 "sorted(same)" 排序并用 "''.join(same) 作为字符串返回
    猜你喜欢
    • 2022-11-30
    • 2013-11-24
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2011-04-03
    • 2016-11-22
    相关资源
    最近更新 更多