在Python元组中,顺序会被保留吗?

32 投票
7 回答
25978 浏览
提问于 2025-04-16 07:53

我有一个时间列表,想把它分成时间段。简单来说,就是把 [t0, t1, ... tn] 变成 [(t0,t1),(t1,t2),...,(tn-1, tn)]。我这样做的:

# start by sorting list of datetimes
mdtimes.sort()
# construct tuples which represent possible start and end dates

# left edges
dtg0 = [x for x in mdtimes]
dtg0.pop()

# right edges
dtg1 = [x for x in mdtimes]
dtg1.reverse()
dtg1.pop()
dtg1.sort()

dtsegs = zip(dtg0,dtg1)

有几个问题...

  1. 我能否相信在我这样创建的每一对 (tn-1, tn) 中,tn-1 一定小于 tn?(顺序会保持吗?)
  2. 用列表推导式复制原始的 mdtimes 列表,这样做算不算好习惯?如果不算,那应该怎么做呢?
  3. 我构建这些元组的目的是为了遍历它们,并用 tn-1tn 来划分一个数据集。这种方法合理吗?也就是说:

    datasegment = [x for x in bigdata if ( (x['datetime'] > tleft) and (x['datetime'] < tright))] 
    

谢谢

7 个回答

6

你可以用 zip 来实现同样的效果:

>>> l = ["t0", "t1", "t2", "t3", "t4", "t5", "t6"]
>>> zip(l[::2], l[1::2])
[('t0', 't1'), ('t2', 't3'), ('t4', 't5')]
22

列表(list)和元组(tuple)都是有顺序的,也就是说它们里面的元素是按照一定的顺序排列的。

dtg0, dtg1 = itertools.tee(mdtimes)
next(dtg0)
dtsegs = zip(dtg0, dtg1)
22
  1. 元组的顺序是你插入值的顺序。它们不会像你想的那样被排序。zip也会保持你插入值的顺序。

  2. 这是一种可以接受的方法,但我有两个其他建议:使用copy模块,或者使用dtg1 = mdtimes[:]

  3. 听起来很合理。

撰写回答