【问题标题】:Splitting a list of lists into smaller lists将列表列表拆分为较小的列表
【发布时间】:2019-06-07 13:16:55
【问题描述】:

我有一个列表列表:

ex = [['1001'],['0010'],['1101'],['0000']]

我想将此列表拆分为更小的列表。我还有另一个列表,其中包含我想要拆分的索引:

track = [1,3]

所以我想拆分这个列表列表来给我以下结果:

sublist = [
    [[1,0],[0,0],[1,1],[0,0]],
    [[0,1],[1,0],[0,1],[0,0]]
    ]

我只是在一个简单的列表上尝试过:

ex = [1,0,0,1]
start = 0
position = []
for i in track:
    position.append(ex[start:i+1])
    start = i+1

但在这种情况下,我的列表已经有整数,而原始列表有字符串。

如何在包含字符串而不是整数的列表中实现这一点?我不知道从哪里开始?

【问题讨论】:

  • 你有没有为此尝试过什么
  • 我只是在一个列表上尝试过。但我不知道如何在列表列表中执行此操作。
  • 你能分享你已有的代码吗?
  • @Peter 尝试先用英文写出算法,然后尝试用 Python 实现。
  • 请在文本中更好地说明您的问题。对我来说,extrack 之间的关系和最终结果 sublist 之间的关系没有意义,我无法得到逻辑

标签: python python-3.x list split


【解决方案1】:

您似乎想将数字拆分为数字,并将每个数字的前两位和后两位放入结果中的单独列表中 - 在这里:

# what you got
ex = [['1001'],['0010'],['1101'],['0000']]

# what you want
sublist = [[[1,0],[0,0],[1,1],[0,0]],
           [[0,1],[1,0],[0,1],[0,0]]]

# how to get there: create single integers from each string
# list comprehension, see below for answers about them
digits = [ list(map(int,l)) for inner in ex for l in inner] 
print(digits )

# create the results 
result = [ [],[] ]

for inner in digits:
    result[ 0].append( inner[:2] )   # list slicing, see below for answers about it
    result[-1].append( inner[2:] )

print(result)

输出(重新格式化):

# split into digits
[[1, 0, 0, 1], [0, 0, 1, 0], [1, 1, 0, 1], [0, 0, 0, 0]]

# put into results
[[[1, 0], [0, 0], [1, 1], [0, 0]],
 [[0, 1], [1, 0], [0, 1], [0, 0]]]

Built in functions 帮助您解释map() 和其他有用的功能。读起来也很有趣:

【讨论】:

  • 是的,您理解正确。但这只是一个例子。本质上,我想根据曲目列表中的索引将其拆分,现在是 [1,3],这就是为什么它是前两位或后两位的原因。但它不会总是这样。如何根据曲目列表中的索引进行拆分?
  • @peter - 而不是 inner[:2]inner[2:] 进行切片,您可能想要使用 inner[: track[0]+1]inner[track[0]+1:](或 inner[track[1]-1:])来引用您的拆分 - 如果您不想这样做跳过值,只需要一个“轨道”编号。只要确保您调整列表切片结束值[0:2]2是切片的一部分。基于列表的索引也是 0 - 所以我不太明白你的 1,3。
  • 所以,1 表示应该在索引 1 上进行拆分(按列),因此列表列表将从 0:1 开始切片,3 表示另一个拆分应该在索引 3(列wise),因此列表将从 2:3 开始拼接
【解决方案2】:
  • sublist 是最终名单。 subsublist 被视为中间临时列表。
  • track 是外循环
  • ex 是内循环

ex = [['1001'],['0010'],['1101'],['0000']]
track = [1,3]
subsublist = []
sublist = []
start=0

for index in track:
    # print(index)
    if start == 0:
        end=index+1
    else:
        end=None
    for item in ex:
        subsublist.append([item[0][start:end]])
    sublist.append(subsublist)
    start=end
    subsublist = []

print(sublist)

[更新]再次尝试使代码有点通用!

ex = [['100190'],['001099'],['110187'],['000050']]
tracks = [1,3,6]
subsublist = []
sublist = []
start=0

for track in tracks:
    indexOfTrack = tracks.index(track)
    if indexOfTrack == 0:
        end=track+1
    elif indexOfTrack > 0 and indexOfTrack < len(tracks)-1:
        end = track+1
    else:
        end=None
    for item in ex:
        subsublist.append([item[0][start:end]])
    sublist.append(subsublist)
    start=end
    subsublist = []

print(sublist)

【讨论】:

  • 谢谢你的回答,但如果我使用它就行不通:ex = [['1001001'],['0010001'],['1101001'],['0000001']]和轨道 = [1,3,6]
  • 没问题@peter。好吧,是的,它不适用于更多轨道,即如果阵列轨道像你说的那样增加,但是如果条件应该使它运行,它会添加 else,但是是的,这使它成为静态的!
  • 很高兴我能帮上忙……即使我编写了一个通用代码……我已经在上面更新了它……看看是否有帮助:)
【解决方案3】:
import itertools
import sys

ex = [['1001'], ['0010'], ['1101'], ['0000']]
track = [1, 3]

# [a,b)
it = itertools.chain(map(lambda x: x - 1, track), [sys.maxsize])
last = next(it, None)
result = []
for curr in it:
    temp = []
    for s in itertools.chain.from_iterable(ex):
        temp.append(list(map(int, s[last:curr])))
    result.append(temp)
    last = curr

print(result)

【讨论】:

  • 感谢您的回答。但是如果 ex 是例如 ex = [['1001001'], ['0010000'], ['1101111'], ['00001010']] 和 track = [1,3,6],它将不起作用。
猜你喜欢
  • 2012-07-12
  • 2012-11-04
  • 2010-10-19
  • 2010-12-11
  • 2020-05-05
  • 1970-01-01
  • 2021-02-02
  • 2021-10-10
  • 1970-01-01
相关资源
最近更新 更多