繁体   English   中英

在字符串列表中查找唯一字符串

[英]Finding the unique string within an list of strings

我已经设法使用以下代码从codewars网站解决了这个练习

def find_uniq(arr):
    diff = None
    first = None
    for s in arr:
        if first is None:
            first = s
            continue

        if (len(first) in [0, 1]) and (len(s) in [0, 1]):
            if arr.count(first) == 1:
                return first
            elif arr.count(s) == 1:
                return s

        temp = set(first.lower()).difference(set(s.lower()))
        if temp:
            diff = s

        if diff is not None:
            temp = set(diff.lower()).difference(set(s.lower()))
            return first if temp else diff

我的代码通过了他们所有的单元测试,但问题是当我使用以下自定义单元测试尝试它时,它失败了

test.assert_equals(['foo', 'abc', 'acb', 'bac', 'bca', 'cab', 'cba dab'], 'foo')  # fails, returns 'abc'

练习如下:

有一个字符串数组/列表。 除了一个之外,所有字符串都包含相似的字母。 试着找到它!

和规则是:

  • 字符串可能包含空格。 空格不重要,只有非空格符号很重要。 例如,只包含空格的字符串就像空字符串。

  • 保证数组/列表包含超过 3 个字符串。

关于如何改进以处理此类情况的任何建议,甚至只是对 function 整体的总体改进。

谢谢你。

循环调用list.count方法效率低下。 您可以改为使用 dict 来跟踪到目前为止您已迭代的唯一字符集。 将字符集减去空格作为字典的键,将字符串本身作为值。 如果当前键已经在字典中,那么您就会知道该键不是唯一的。 然后任务变成找到与该公共密钥不同的密钥。 如果字典中已经有不同的键,则返回该不同键的值。 如果没有,请继续迭代,直到获得与已知公共密钥不同的密钥:

def find_uniq(arr):
    seen = {}
    common = None
    for string in arr:
        key = frozenset(set(string.lower()).difference(' '))
        if key in seen:
            common = key
        if common is not None:
            if key != common:
                return string
            if len(seen) > 1:
                del seen[common]
                return next(iter(seen.values()))
        seen[key] = string

以便以下表达式都为True

find_uniq(['foo', 'abc', 'acb ']) == 'foo'
find_uniq(['abbc', 'foo', 'acb ']) == 'foo'
find_uniq(['abc', 'acb ', 'foo']) == 'foo'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM