循环创建一个元组

时间:2015-12-02 23:02:23

标签: python django

我正在尝试发送群发邮件。

以下是群发邮件文档:Just a link to the Django Docs

为了达到这个目的,我需要创建这个元组:

datatuple = (
    ('Subject', 'Message.', 'from@example.com', ['john@example.com']),
    ('Subject', 'Message.', 'from@example.com', ['jane@example.com']),
)

我在ORM中查询了一些收件人的详细信息。然后我会想到有一些循环涉及,每次添加另一个收件人到元组。除了用户名和电子邮件之外,邮件的所有元素都是相同的。

到目前为止,我有:

recipients = notification.objects.all().values_list('username','email')
# this returns [(u'John', u'john@example.com'), (u'Jane', u'jane@example.com')]
for recipient in recipients:    
     to = recipient[1]               #access the email
     subject = "my big tuple loop"
     dear = recipient[0]              #access the name  
     message = "This concerns tuples!"
     #### add each recipient to datatuple
     send_mass_mail(datatuple)

我一直在尝试这样的事情: SO- tuple from a string and a list of strings

2 个答案:

答案 0 :(得分:4)

如果我理解正确,理解就很简单了。

emails = [
    (u'Subject', u'Message.', u'from@example.com', [address])
    for name, address in recipients
]
send_mass_mail(emails)

请注意,我们利用Python将tuple解包为一组命名变量的能力。对于recipients的每个元素,我们将其第0个元素分配给name,将其第一个元素分配给address。因此,在第一次迭代中,nameu'John'addressu'john@example.com'

如果您需要根据名称更改'Message.',可以使用字符串格式或您选择的任何其他格式/模板机制来生成消息:

emails = [
    (u'Subject', u'Dear {}, Message.'.format(name), u'from@example.com', [address])
    for name, address in recipients
]

由于以上是列表推导,因此emailslist。如果真的需要这个tuple而不是list,那也很简单:

emails = tuple(
    (u'Subject', u'Message.', u'from@example.com', [address])
    for name, address in recipients
)

对于这个,我们实际上将生成器对象传递给tuple构造函数。这具有使用生成器的性能优势,而没有创建中间list的开销。你可以在Python中任何可以接受迭代参数的地方做到这一点。

答案 1 :(得分:1)

这里需要进行一些清理:

1)实际上在循环中构建元组(这有点棘手,因为你需要额外的逗号来确保附加元组而不是元组中的值)

2)将send_mass_mail调用移出循环

这应该是有效的代码:

cocoa

编辑: jpmc26的技术肯定更有效率,如果你计划发送一个大的电子邮件列表,你应该使用它。很可能你应该使用对你个人最有意义的代码,这样当你的需求发生变化时,你可以很容易地理解如何更新。