[英]Finding the unique string within an list of strings
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.