Python使用while循环操作元组列表

Python使用while循环操作元组列表,python,list,while-loop,tuples,Python,List,While Loop,Tuples,我正在尝试编写一个python函数,它使用while循环遍历包含日期和每个日期的步数的元组输入列表。我的函数的两个输入是列表和一些必需的步骤。函数需要遍历列表并计算达到所需步骤数所需的天数。下面是到目前为止我的代码,它适用于初始部分,但是我还需要添加到它中,以便在元组的输入列表中未达到所需的步骤数时,函数返回“None”。另一件事是,我只能有一个return语句,因为这个问题是这样表述的,这就是为什么我一直坚持这个问题的部分原因 def days_to_reach_n_steps(step_re

我正在尝试编写一个python函数,它使用while循环遍历包含日期和每个日期的步数的元组输入列表。我的函数的两个输入是列表和一些必需的步骤。函数需要遍历列表并计算达到所需步骤数所需的天数。下面是到目前为止我的代码,它适用于初始部分,但是我还需要添加到它中,以便在元组的输入列表中未达到所需的步骤数时,函数返回“None”。另一件事是,我只能有一个return语句,因为这个问题是这样表述的,这就是为什么我一直坚持这个问题的部分原因

def days_to_reach_n_steps(step_records, n):
  """DOCSTRING"""
  total_steps = 0
  counter = 0
  while total_steps < n:
      total_steps = total_steps + step_records[counter][1]
      counter = counter + 1
  return(counter)
def天数到达步骤(步骤记录,n):
“文档字符串”
总步数=0
计数器=0
当总步数
作为我测试函数的一个示例,此特定示例应返回
None
,因为列表中的步骤从未达到或超过50

step_records=[('2010-01-01',3),
('2010-01-02',2),
('2010-01-03',1)]
天数=达到步骤的天数(步骤记录,50)

打印(天)

在我看来,最简单的解决方案是这里的
循环,因为基本上您需要的是迭代。您还可以使用
enumerate
记录当天的情况:

sample_steps = [("2010-01-1", 1),
                ("2010-01-2", 3),
                ("2010-01-3", 5),
                ("2010-01-4", 7),
                ("2010-01-5", 9),
                ("2010-01-6", 11)]

def days_to_reach_n_steps(step_records, n):
    total_steps = 0
    for counter, (date, steps) in enumerate(step_records, 1):
        total_steps += steps
        if total_steps >= n:
            return counter, date
我选择奇数作为步骤序列,因为它们的累积和是平方(便于肉眼检查):

这将返回以下内容:

0 steps in 1 days (arrived at 2010-01-1)
1 steps in 1 days (arrived at 2010-01-1)
2 steps in 2 days (arrived at 2010-01-2)
3 steps in 2 days (arrived at 2010-01-2)
4 steps in 2 days (arrived at 2010-01-2)
5 steps in 3 days (arrived at 2010-01-3)
8 steps in 3 days (arrived at 2010-01-3)
9 steps in 3 days (arrived at 2010-01-3)
10 steps in 4 days (arrived at 2010-01-4)
15 steps in 4 days (arrived at 2010-01-4)
16 steps in 4 days (arrived at 2010-01-4)
17 steps in 5 days (arrived at 2010-01-5)
24 steps in 5 days (arrived at 2010-01-5)
25 steps in 5 days (arrived at 2010-01-5)
26 steps in 6 days (arrived at 2010-01-6)
35 steps in 6 days (arrived at 2010-01-6)
36 steps in 6 days (arrived at 2010-01-6)
37 was unreached
请注意,
days\u to\u reach\u n\u steps
只有一个
return
语句,但对于
37
,仍然能够
return
None
。这是因为不返回任何内容的函数隐式返回
None
。但是,这与0的规范不太匹配。如果希望0成为例外,我建议您这样做:

for counter, (date, steps) in enumerate([("start", 0)] + step_records):
答案的第一行将改为

0 steps in 0 days (arrived at start)
这将保持算法的其余部分,因此不需要编程边缘情况

如果必须是while循环,您可以稍微开玩笑地将for循环重写为:

def days_to_reach_n_steps(step_records, n):
    total_steps = 0
    counter = 0
    step_records = [("start", 0)] + step_records
    while counter < len(step_records):
        date, steps = step_records[counter]
        total_steps += steps
        if total_steps >= n:
            return counter, date
        counter += 1
def天数到达步骤(步骤记录,n):
总步数=0
计数器=0
步骤记录=[(“开始”,0)]+步骤记录
当计数器=n:
退货柜台,日期
计数器+=1

这与for循环方法的第二次迭代完全相同(
$diff在
索引器退出
并在未达到时将
c
设置为
None

def daystoreach(steprecords, n):
total = 0
x = 0
while total < n:
    try:
        total += sr[x][1]
        x += 1
    except IndexError:
        break
if total < n:
    x = None
return x
def daystoreach(步骤记录,n):
总数=0
x=0
当总量
您能否提供一个
step_records
的示例(如果您只使用一个部分,为什么它是一个元组列表?),以及您的预期输出是什么与您目前得到的结果是什么?编辑了我的问题,其中包含了我调用函数的示例。在修改函数后,我将使用
步骤记录的日期部分,以返回到达
n
的日期,但是我认为最好不要使用该部分他问我这个问题是因为我认为我应该首先把重点放在计算初始部分。如果
n
为0,你会返回多少天/日期?不会说谎,我没有想到。我想输出0或
None
也可以。是的,我以前用for循环解决过这个问题,但问题是ays它不允许循环,必须使用while循环。还有其他可能使用while循环的解决方案吗?你是一个传奇人物。投票通过并标记为答案。感谢你的时间!我真的建议使用更具表达力的变量名-如果我没有使用你缩写的扩展,我不知道wa
dtrns
是什么。做了(是的,很晚了)
def daystoreach(steprecords, n):
total = 0
x = 0
while total < n:
    try:
        total += sr[x][1]
        x += 1
    except IndexError:
        break
if total < n:
    x = None
return x