whois.py的双循环

时间:2014-04-04 01:06:22

标签: python

我使用字典,其中id为键,名称为值。我想要做的是获取其中具有相同名称的值中的名称并将它们放入列表中。例如,名称为tim:

{'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)

问题是:我不想在此代码中使用双循环,但如果可能的话,我不确定如何操作。

1 个答案:

答案 0 :(得分:0)

逻辑上相同但更短且更有效的解决方案是使用sets而不是列表。

您最内层的for循环只会使whois_list中的每个非重复名称扩展l。如果您最初定义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]