1

我有一个与此类似的嵌套列表,并按时间升序排序:

[[TIME, 'b', 0],
[TIME, 'b', 1],
[TIME, 'b', 1],
[TIME, 'b', 1],
[TIME, 'b', 10],
[TIME, 'b', 0],
[TIME, 'b', 1],
[TIME, 'b', 1],
[TIME, 'b', 10],
[TIME, 'b', 0],
[TIME, 'b', 1],
[TIME, 'b', 1],
[TIME, 'b', 1],
[TIME, 'b', 1],
[TIME, 'b', 10]]

每个列表中的第三项是 0、1 或 10。0 代表开始,1 代表移动,10 代表结束。如何将其拆分为进一步的嵌套列表,以便最终得到与此类似的旅程列表:

[[[TIME, 'b', 0],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 10]],
[[TIME, 'b', 0],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 10]],
[[TIME, 'b', 0],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 10]]]
4

5 回答 5

4

可能有一种更 Pythonic 的方式来做到这一点,但这是功能性的,直接的并且应该很容易理解。biglist保存初始数据。

newlist = []
sublist = []
for i in biglist:
    sublist.append(i)
    if i[2] == 10:
        newlist.append(sublist)
        sublist = []

给出:

[[[TIME, 'b', 0],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 10]],
[[TIME, 'b', 0],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 10]],
[[TIME, 'b', 0],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 1],[TIME, 'b', 10]]]
于 2012-08-26T23:57:06.907 回答
1
#x is your initial list
k, new_list = 0, []
for i,j in enumerate(x):
    if j[2] == 10:
        new_list.append(x[k:i+1])
        k = i+1
于 2012-08-26T23:59:23.667 回答
1

与其他解决方案相反,我们在这里测试旅程是否开始(d[2] == 0)而不是何时结束:

output = []
for d in data:
    if d[2] == 0:
        # Starting a new journey: we add a new list
        output.append([d])
    else:
        # Continuing a journey: we extend the last list
        output[-1].extend([d])

当然,如果第一次旅程从未开始,这将失败(你会IndexErrorelse声明中得到一个)......

于 2012-08-27T00:04:26.667 回答
0

如果我正确理解了这个问题,最明显的解决方案是:

def iter_journeys(lst):
    for e in lst:
        act = e[2]

        if act == 0:
            journey = []

        journey.append(e)

        if act == 10:
            yield journey
于 2012-08-26T23:56:55.237 回答
0

我确信有一种更有效的方法可以做到这一点,但这是一个基本的解决方案:

def create_journeys(paths):
  journeys = [[]]

  for path in paths:
    journeys[-1].append(path)

    if path[-1] == 10:
      journeys.append([])

  return journeys
于 2012-08-26T23:58:08.137 回答