簡體   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