簡體   English   中英

匹配列表中的第一個和最后一個項目

[英]Matching first and last of items in list

我的目標是遍歷名稱列表並返回True,只要它們可以被安排,以便名稱的最后一個字母與下一個名字的第一個字母相同。

class Team(object):
    def __init__(self, names):
        self.names = names

    def __iter__(self):
        from collections import Counter
        first = Counter(map(lambda n: n[0].lower(), self.names))
        last = Counter(map(lambda n: n[-1].lower(), self.names))
        diff = last - first
        return any(diff.values()) <= 1

def isCoolTeam(team):
    return bool(Team(team))

print(isCoolTeam(["Rob", 
 "Bobby", 
 "Billy"]))

它應該返回False,但由於某種原因,每個輸入都返回true。

函數any()返回一個booleanTrue / False ),所有booleans 小於等於<=1

這意味着該line

return any(diff.values()) <= 1

始終評估為True

以下是一些修改。 Team轉換為布爾值似乎沒有意義,所以我不會定義__bool__但是明確定義is_cool

另外,我想你想檢查一下是否沒有差異大於1.在這種情況下,你需要all(v <= 1 for v in diff.values())

class Team(object):
    def __init__(self, names):
        self.names = names

    def is_cool(self):
        from collections import Counter
        first = Counter(map(lambda n: n[0].lower(), self.names))
        last = Counter(map(lambda n: n[-1].lower(), self.names))
        diff = last - first
        return all(v <= 1 for v in diff.values())

print(Team(["Rob", "Bobby", "Billy"]).is_cool())
# False
print(Team(["Rob", "Nick", "Bobby", "Yann"]).is_cool())
# True

但是邏輯仍然存在(大)問題:

print(Team(["Ab", "cd", "ef"]).is_cool())
# True

我認為Counter不足以解決這個問題。 您可能需要定義一個圖表,看看是否有連接每個名稱的路徑。 NetworkX可能有所幫助。

這是相關圖問題的描述。

你的問題是配對元素之一。 您希望將特定的第一個字母與相應的最后一個字母一遍又一遍地匹配,直到所有名稱都用完為止。

如果你考慮一下,當你完成后,你將在開始時有一個未配對的第一個字母,最后一個未配對的最后一封信:

Rob-> Bobby-> Yannick-> Karl-> Luigi-> Igor-> Renee-> Edmund->大衛 - >提奧奇尼斯

這意味着字母計數的減法應該是1,在兩個方向上:應該有1個首字母不匹配,1個最后一個字母不匹配(第一個 - 最后一個,最后一個)。 但是,如果有重復的信件,即使這可能還不夠。 您想檢查列表的長度(以確保它有效),然后檢查差異<= 1。

假設您有一個長度為0的列表:第一個/最后一個字母的計數將為空,但列表太短。

假設你有一個長度為1的列表:第一個/最后一個字母的數量將是1和1,符合要求。

假設你有一個長度為2的列表:

  • 假設沒有重疊:['rob','diane']那么第一個/最后一個字母的總計數將是2和2,違反了要求。

  • 假設沒有重疊,但共享字母:['brad','betty']然后,第一個/最后一個字母的總計數將是2和2,但排列方式不同。 我想你應該總結一下。 ;-)

  • 假設存在完全重疊:['bob','bob']。 這留下了空的減法,符合要求。

  • 假設存在部分重疊:['bob','betty']。 這會分別留下{b:1}和{y:1}的計數,因此它可以正常工作。

您必須處理差異為空的情況,其中差異具有一個包含2+計數的元素,並且差異具有多個具有1或更多計數的元素。

我不認為你想要any() 我認為你需要某種聚合功能。 我懷疑sum()會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM