从一个列表构造一个字典,其中每个值都包含当前键的补码

2024-05-15 21:44:57 发布

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

我正在编写一个名为everyone_sign()的Python函数,它获取一个名称列表并返回一个字典,其中键是名称,值是仅由其他名称签名的再见消息。姓名密钥不能在自己的卡上签名。我的问题是如何为每次迭代输出除当前键以外的所有名称

到目前为止我已经

def everyone_sign(names):

    message = "Thank You!, Your Friends, "
    space = ", "
    message_Dict = {}

    for i in range(len(names)):
        message = message + names[i] + space

        for j in range(len(names)):
            message_Dict[names[j]] = message

    return message_Dict

n = ["Mike", "Dan", "Stan", "Max", "Rad", "Ned"]
print(everyone_sign(n))

这将产生以下输出:

{'Dan': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Rad, Ned, ',
 'Max': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Rad, Ned, ',
 'Mike': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Rad, Ned, ',
 'Ned': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Rad, Ned, ',
 'Rad': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Rad, Ned, ',
 'Stan': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Rad, Ned, '}

但我希望:

{'Dan': 'Thank You!, Your Friends, Mike, Stan, Max, Rad, Ned',
 'Max': 'Thank You!, Your Friends, Mike, Dan, Stan, Rad, Ned',
 'Mike': 'Thank You!, Your Friends, Dan, Stan, Max, Rad, Ned',
 'Ned': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Rad',
 'Rad': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Ned',
 'Stan': 'Thank You!, Your Friends, Mike, Dan, Max, Rad, Ned'}

Tags: 名称youmessageyournamesmaxmikethank
3条回答

这是一种使用列表切片的方法。你知道吗

例如:

def everyone_sign(names):

    message = "Thank You!, Your Friends, "
    message_Dict = {}
    for idx, name in enumerate(names):
        message_Dict[name] = message + ", ".join(names[:idx] + names[idx+1:])    #list slicing
    return message_Dict

n = ["Mike", "Dan", "Stan", "Max", "Rad", "Ned"]
print(everyone_sign(n)) 

输出:

{'Dan': 'Thank You!, Your Friends, Mike, Stan, Max, Rad, Ned',
 'Max': 'Thank You!, Your Friends, Mike, Dan, Stan, Rad, Ned',
 'Mike': 'Thank You!, Your Friends, Dan, Stan, Max, Rad, Ned',
 'Ned': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Rad',
 'Rad': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Ned',
 'Stan': 'Thank You!, Your Friends, Mike, Dan, Max, Rad, Ned'}

使用列表理解的示例:

def everyone_sign(names):
    return {name:'Thank You!, Your Friends, '+', '.join([other_name for other_name in names if other_name!=name]) for name in names}

输出:

{'Dan': 'Thank You!, Your Friends, Mike, Stan, Max, Rad, Ned',
 'Max': 'Thank You!, Your Friends, Mike, Dan, Stan, Rad, Ned',
 'Mike': 'Thank You!, Your Friends, Dan, Stan, Max, Rad, Ned',
 'Ned': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Rad',
 'Rad': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Ned',
 'Stan': 'Thank You!, Your Friends, Mike, Dan, Max, Rad, Ned'}

我认为使用条件列表理解是一个简单的解决方案:

def everyone_sign(names):
    messages = {}

    for name in names:
        messages[name] = "Thank You!, Your Friends, {}".format(
            ", ".join([n for n in names if n != name]))

    return messages


n = ["Mike", "Dan", "Stan", "Max", "Rad", "Ned"]
print(everyone_sign(n))

输出

{'Mike': 'Thank You!, Your Friends, Dan, Stan, Max, Rad, Ned', 
 'Dan': 'Thank You!, Your Friends, Mike, Stan, Max, Rad, Ned', 
 'Stan': 'Thank You!, Your Friends, Mike, Dan, Max, Rad, Ned', 
 'Max': 'Thank You!, Your Friends, Mike, Dan, Stan, Rad, Ned', 
 'Rad': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Ned', 
 'Ned': 'Thank You!, Your Friends, Mike, Dan, Stan, Max, Rad'}

相关问题 更多 >