匹配lis中的第一个和最后一个项目

2024-10-08 18:26:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是遍历一个名称列表,并且只有当它们可以被安排成一个名称的最后一个字母与下一个名称的第一个字母相同时才返回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。你知道吗


Tags: lambdaself名称mapreturnnamesdef字母
3条回答

函数^{}返回一个booleanTrue/False),并且所有booleans小于等于<=1。你知道吗

这意味着line

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

始终计算为True。你知道吗

您的问题是配对元素之一。您需要一次又一次地将特定的第一个字母与对应的最后一个字母进行匹配,直到所有名称都用尽。你知道吗

如果你仔细想想,当你完成后,你会在开头有一个未配对的第一个字母,在结尾有一个未配对的最后一个字母:

罗伯->;博比->;扬尼克->;卡尔->;路易吉->;伊戈尔->;蕾妮->;埃德蒙->;大卫->;迪奥奇尼斯

这意味着字母计数的减法应该是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()会奏效。你知道吗

这里有一些修改。将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可能会有帮助。你知道吗

下面是related graph problem的描述。你知道吗

相关问题 更多 >

    热门问题