Python 3.x:从顺序行中减去相同的索引

时间:2017-06-28 21:14:45

标签: python list data-structures time iterator

我有5000多行和不同长度的数据集就任何给定数据行中存在的元素而言。我已将每行数据存储为list,其中每个元素都存储为index(即某些行可能有5个索引,其他行可能有20个)。索引2 始终该数据行的已用时间。

我的脚本当前iterates通过数据集使用for循环作为构建数据的方法。见下文:

f = open(fn)
for line in iter(f):

    remove_blanks = ['']
    entries = line.split()
    ''.join([i for i in entries if i not in remove_blanks])
    trash = (entries[0], entries[1])
    time = int(entries[2])  # Time expressed as elapsed time in milliseconds
    column = [int(v) for v in entries[3:]]

脚本迭代的行(来自数据集)看起来像

x y #time a b

d e #time f g h

然后将其放入像

这样的列表中

['x', 'y', '#time', 'a', 'b']

['d', 'e', '#time', 'f', 'g', 'h']

我想从任何给定行中的时间迭代地减去初始时间(非零)。例如,我想做 (#time on line x) - (#time on line 0)print每行的已用时间。也许这可以在创建数据结构之前完成,我不确定。

请帮忙!

谢谢

3 个答案:

答案 0 :(得分:2)

你可以做这样的事情

f = open(fn)
t0 = None
for line in iter(f):

    remove_blanks = ['']
    entries = line.split()
    ''.join([i for i in entries if i not in remove_blanks])
    trash = (entries[0], entries[1])
    time = int(entries[2])  # Time expressed as elapsed time in milliseconds
    if t0 is None: # first iteration, store time at t0
        t0 = time
    else:
        print("Elapsed time: {}ms".format(time - t0)) # every iteration except the first, print elapsed time
    column = [int(v) for v in entries[3:]]

它将打印每次迭代所经过的时间。我认为这就是你要求帮助

答案 1 :(得分:2)

首先,您没有将每一行存储为列表。这只是语义,但您似乎已将行存储在文本文件中。您正在从文本文件中读取行,然后读取将它们转换为字符串的行,然后将它们拆分为列表。请记住,编程时语义很重要。

如果我们根据您提供的示例改进您的代码,我会执行以下操作:

import time
start = int(time.time() * 1000)
f = open()

for line in iter(f):
    entries = [i for i in line.split() if i]
    print(int(entries[2]) - start)

现在,我根据你真正想做的事情删除了很多对我来说似乎很残酷的事情,就是根据时间戳来计算时间。

  1. 您不需要带有空字符串的列表来确认是否存在 现有字符串(注意警告,请参阅this
  2. 您没有存储 .join 功能的返回值,这完全是多余的
  3. 垃圾既未使用
  4. 都不是

    也许你遗漏了部分代码,但这是我从你的描述中可以理解的。现在,我不确定您为什么要将我称之为开始的内容与您所采用的时间戳进行比较。它总是一个负值,因为我假设文件是​​在程序执行之前创建的,我希望你真的想要 print(start - int(entries [2])) < / em>但这只是猜测。

    如果您真正想要的是为您的功能计时,我建议您先查看https://docs.python.org/3/library/timeit.html

答案 2 :(得分:1)

您可以在运行循环时直接执行此操作:

initial_time = None
f = open(fn)
for line in iter(f):

    remove_blanks = ['']
    entries = line.split()
    ''.join([i for i in entries if i not in remove_blanks])
    trash = (entries[0], entries[1])
    time = int(entries[2])  # Time expressed as elapsed time in milliseconds
    # if on first line, initial_time is None, so set it.
    if initial_time is None:
        initial_time = time
    print(time - initial_time)

    column = [int(v) for v in entries[3:]]

也许值得指出你的代码行

''.join([i for i in entries if i not in remove_blanks])

目前没有做任何事情,因为join方法的返回值没有分配给任何东西。