【问题标题】:Python: Calculating difference of values in a nested list by using a While LoopPython:使用 While 循环计算嵌套列表中的值的差异
【发布时间】:2016-09-15 23:06:39
【问题描述】:

我有一个由嵌套列表组成的列表,每个嵌套列表包含两个值 - 一个浮点值(文件创建日期)和一个字符串(文件名)。

例如:

n_List = [[201609070736L, 'GOPR5478.MP4'], [201609070753L, 'GP015478.MP4'],[201609070811L, 'GP025478.MP4']]

嵌套列表已按升序排列(创建日期)。我正在尝试使用 While 循环来计算每个顺序浮点值之间的差异。

例如:201609070753 - 201609070736 = 17

目标是使用时差值作为对文件进行分组的基础。

我遇到的问题是,当计数达到len(n_List) 的最后一个值时,它会抛出IndexError,因为count+1 超出范围。

IndexError: list index out of range

我不知道如何解决这个错误。无论我尝试什么,当它到达列表中的最后一个值时,计数总是在范围内。

这是我一直在使用的 While 循环。

count = 0

while count <= len(n_List):
    full_path = source_folder + "/" + n_List[count][1]

    time_dif = n_List[count+1][0] - n_List[count][0]


    if time_dif < 100:  
       f_List.write(full_path + "\n")
       count = count + 1 
    else: 
        f_List.write(full_path + "\n")
        f_List.close()
        f_List = open(source_folder + 'GoPro' + '_' + str(count) + '.txt', 'w')
        f_List.write(full_path + "\n")
        count = count + 1

PS。我能想到的唯一解决方法是假设最后一个值将始终附加到最后一组文件。因此,当计数达到len(n_List - 1) 时,我跳过时间差异计算,并自动将最终值添加到最后一组。虽然这可能在大多数情况下都有效,但我可以看到列表中的最终值可能需要放在单独的组中的极端情况。

【问题讨论】:

  • 那么您希望最后一个文件进入哪个文件夹?
  • 文件实际上并没有去任何地方,我只是使用时间差异计算将文件分组到不同的列表中。文件路径根据分组写出到单独的 txt 文件中。所以在这种情况下,最后一个值将被添加到最后一个文本文件的最后一行。这有意义吗?
  • 最后的数据呢?
  • 你有一个算法问题。如果您有 n 个值的列表,则值之间将只有 n-1 个差异。如果你想对 n 个对象进行分类,你不能只使用 n-1 个值。你需要想出一个更好的算法。
  • 数字后面的L 后缀使其成为long(一种整数),而不是浮点数。

标签: python list while-loop nested


【解决方案1】:

我认为使用 zip 可能更容易获得差异。

res1,res2 = [],[]
for i,j in zip(n_List,n_List[1:]):
    target = res1 if j[0]-i[0] < 100 else res2
    target.append(i[1])

【讨论】:

  • @galaxyman,感谢您的帮助,我同意 zip 功能可能是获取时间差异的更好方法。但我仍然遇到两个问题。 (1) 当j[0]-i[0] 为100 或更大时,此函数会将i[0] 值写入新组,而实际上应该是j[0] 值应该是新组的开始。 (2) 当函数到达列表末尾时,我仍然看到一个问题。列表中的最后一个值位于最后一组的左侧,我假设是因为 j[0]-i[0] 操作在您到达最后一次时不起作用 - 在到达最后一个 i[0] 后没有 j[0]
  • @vgndc 为第一个,您可以在循环完成后反转列表。第二,最后一个元素你想要什么?
  • @galaxyman,使用reversed() 的问题是需要将列表值写入.txt 文件。例如,time dif 100 开始一个新的 text-2.txt。因此,反向操作并不能真正解决第一遍出现的问题。值将已写入错误的 .txt 文件。对于第二个问题,尽量清楚一点, zip 函数似乎没有考虑嵌套列表中的不均匀对。所以我需要想办法在循环到达最后一个 i,j 对时将最后一个 j[1] 值写入最后一个 .txt 文件。
  • @galaxyman,实际上我刚刚意识到我上次回复的前半部分是由于我的函数中的错误。第二部分仍未解决 - 当循环到达最后一个嵌套列表时,我需要将最后一个值写入最后一个 .txt 文件,即使不需要计算列表中最后一个值的时间差异。
【解决方案2】:

n_list(len(n_list)) 总是会返回索引超出范围的错误

while count < len(n_List):

应该足够了,因为您从 0 开始计数,而不是 1。

【讨论】:

    【解决方案3】:

    仅供参考,这是我使用的解决方案,感谢@galaxyman 的帮助。

    我通过简单地处理了嵌套列表中最后一个值的问题 在循环完成后添加该值。不知道是不是最 优雅的方式来做到这一点,但它的工作原理。

    (注意:我只发布与之前帖子中建议的 zip 方法相关的功能)。

        def list_zip(get_gp_list): 
            ffmpeg_list = open(output_path + '\\' + gp_List[0][1][0:8] + '.txt', 'a')
            for a,b in zip(gp_List,gp_List[1:]):
                full_path = gopro_folder + '\\' + a[1]
                time_dif = b[0]-a[0]
                if time_dif < 100: 
                    ffmpeg_list.write("file " + full_path + "\n")
                else:
                    ffmpeg_list.write("file " + full_path + "\n")
                    ffmpeg_list.close()
                    ffmpeg_list = open(output_path + '\\' + b[1][0:8] + '.txt', 'a') 
    
        last_val = gp_List[-1][1]
        ffmpeg_list.write("file " + gopro_folder + '\\' + last_val + "\n")
        ffmpeg_list.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多