如何在Python的嵌套循环中只迭代一次列表



我打算向许多号码发送消息,但这是我的代码和问题(代码更短,所需行在这里):

msg = 'test message'
phone_numbers = ['+989111111111', '+989111111112', '+989111111113', '+989111111114']
hours = range(0, 25)
minutes = range(0, 60)
for phone_number in phone_numbers:
for hour in hours:
for minute in minutes:
sndmsg(phone_number, msg, hour, minute)

我知道我的方法是不正确的,因为这是输出,但我不确定如何解决这个问题。在谷歌上搜索也帮不了我。

输出:

test message to +989111111111 will be sent on 0 0
test message to +989111111111 will be sent on 0 1
test message to +989111111111 will be sent on 0 2
...
test message to +989111111112 will be sent on 0 0
test message to +989111111112 will be sent on 0 1
test message to +989111111112 will be sent on 0 2

我想要的输出是这样的:

test message to +989111111111 will be sent on 0 0
test message to +989111111112 will be sent on 0 1
test message to +989111111113 will be sent on 0 3

我想像上面的输出一样,每分钟向每个号码发送消息,我怎么才能达到这一点?

尝试使用小时和分钟生成器并压缩电话号码:

msg = 'test message'
phone_numbers = ['+989111111111', '+989111111112', '+989111111113', '+989111111114']
def gen_hour_min():
hours = range(0, 25)
for hour in hours:
minutes = range(0, 60)
for minute in minutes:
yield hour, minute
for phone_number, hour_min in zip(phone_numbers, gen_hour_min()):
hour, minute = hour_min
print(phone_number, hour, minute)

您可以创建一个迭代器,然后在所有迭代时跳出

phone_numbers = ['+989111111111', '+989111111112', '+989111111113', '+989111111114']
def schedule(numbers):
iterator = iter(numbers)
for hour in hours:
for minute in minutes:
curr_number = next(iterator)
if curr_number is None:
return
sndmsg(curr_number, msg, hour, minute)

schedule(phone_numbers)

另外,您可以将分钟设置为整数,并使用math来迭代

def schedule(numbers):
minutes = 0
for number in numbers:
sndmsg(curr_number, msg, minutes // 60, minutes % 60)
minutes += 1

你不需要迭代时间

你可以增加发送消息后的时间

msg = 'test message'
phone_numbers = ['+989111111111', '+989111111112', '+989111111113', '+989111111114']
hour =0
minute =0
for phone_number in phone_numbers:
sndmsg(phone_number, msg, hour, minute)
hour=hour+1 if minute==60 else  hour
minute =minute+1 if minute <60 else 0

因为要在phone_number循环上迭代,所以phone_number循环应该是内部循环:

minute = 0
outer: for hour in hours:
for phone_number in phone_numbers:
if minute > 60:
minute = 0
continue outer
sndmsg(phone_number, msg, hour, minute)
minute = minute+1                
break outer

最新更新