2013-06-02 27 views
0

我有一个大名单:Python的突破和调换大名单成更小的名单

X= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17] 

,我要转成更小的列表: (X1-X5是重新映射在X数据占位符,用于X = 17,较小的列表的长度是所有事项)

x1 = [0, 1], 
x2 = [0, 1, 2, 3] 
x3 = [0, 1, 2, 3] 
x4 = [0, 1, 2, 3] 
x5 = [0, 1] 

预期的结果:要在大列表中的数据映射到X 1 -X 5是这样的:

x1 = [0, 5] 
x2 = [1, 6, 10, 13] 
x3 = [2, 7, 11, 14] 
x4 = [3, 8, 12, 15] 
x5 = [4, 9] 

我试图通过附加较小的列表进入大名单S和他们调换入T像这样向后工作我的方式:

s = [[0, 1], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1]] 
t=map(None,*s) 
[(0, 0, 0, 0, 0), (1, 1, 1, 1, 1), (None, 2, 2, 2, None), (None, 3, 3, 3, None)] 

这是我卡住了。任何帮助在这里将不胜感激。我敢肯定有一个更简单的方法来做到这一点,而不追加,并将x重新映射到t,并将t分解为x1 -x5。

+0

我不明白你的问题 - 这是什么'X2 = [0 ,1,2,3]'代表? – Eric

+0

您是想为这个特殊结构创建一个函数,还是需要将函数以x1..x5作为输入并根据内容填充它们?它是否需要处理这些列表中超过五个的情况?它是否需要处理任意列号? –

+0

如果'sum(len(part)for(x1,x2,x3,x4,x5))!= len(x)'中的部分会发生什么? – Eric

回答

0

这里是一个有点奇怪的解决方案:

import itertools 

def transpose_into(data, sizes): 
    parts = [([], size) for size in sizes] 

    # build a cycling iterator over the resultant lists 
    iterparts = itertools.cycle(parts) 

    for value in data: 
     # Iterate at most once through the cycle 
     for group, size in itertools.islice(iterparts, len(parts)): 
      # put our value in the list if it's not full 
      if len(group) < size: 
       group.append(value) 
       break 
     else: 
      # completed cycle, all lists full - stop 
      break 

    return [group for group, size in parts] 
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17] 
>>> splits = [2, 4, 4, 4, 2] 
>>> transpose_into(x, splits) 
[[0, 5], [1, 6, 10, 13], [2, 7, 11, 14], [3, 8, 12, 15], [4, 9]] 
+0

是的,x1-x5是只是我制作的将数据映射到的占位符。它正在寻找的transpose_into()函数 – user2444869

+0

@ user2444869:查看我的更新 – Eric

+0

哇,谢谢!这就是我想要的 – user2444869

1

对待一切,二维数组的工作原理:

def transpose_into(x, splits): 
    max_col = max(splits) 
    res = [[None] * split for split in splits] 
    col = 0 
    xiter = iter(x) 
    while True: 
     for sub_list in res: 
      try: 
       sub_list[col] 
       sub_list[col] = next(xiter) 
      except IndexError: 
       continue 
     col += 1 
     if col > max_col: 
      break 
    return res 
assert transpose_into(x, splits) == [[0, 5], [1, 6, 10, 13], [2, 7, 11, 14], 
            [3, 8, 12, 15], [4, 9]]