双回路天哪

2024-04-25 06:22:23 发布

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

我正在使用一个以id为键,以名称为值的字典。我要做的是获取值中具有相同名称的名称,并将它们放入一个列表中。比如蒂姆的名字:

{'id 1': ['timmeh', 'user543', 'tim'], 'id 2': ['tim', 'timmeh', '!anon0543']}
whois_list = ['timmeh', 'user543', 'tim', '!anon0543']

机器人会附加列表中还没有的名字。下面是执行此示例的代码:

def who(name):
    whois_list = []
    if not any(l for l in whois.whoisDB.values() if name.lower() in l):
        return 'No alias found for <b>%s</b>." % name.title()
    else:
        for l in whois.whoisDB.values():
            if name.lower() in l:
                for names in l:
                    if names not in whois_list
                        whois_list.append(names)
        return "Possible alias found for <b>%s</b>: %s" % (name.title(), whois_list)

问题是:我不想在这段代码中有一个双循环,但如果可能的话,我真的不确定如何做到这一点。你知道吗


Tags: namein名称id列表forifnames
1条回答
网友
1楼 · 发布于 2024-04-25 06:22:23

一个逻辑上等价但更简短、更有效的解决方案是使用sets而不是列表。你知道吗

最里面的for循环只是用l中每个不重复的名称扩展whois_list。如果最初定义whois_list = set([]),则可以用以下内容替换内部for循环的三行:

whois_list = whois_list.union(l)

例如

>>> a = set([1,2,3])
>>> a = a.union([3,4,5])
>>> a
set([1, 2, 3, 4, 5])

您会注意到a打印出来的结果略有不同,这表明它是一个set而不是一个列表。如果这是一个问题,您可以在return语句之前转换它,如中所示

>>> a = list(a)
>>> a
[1, 2, 3, 4, 5]

相关问题 更多 >