【问题标题】:How to divide a list into chunks of alternating sizes in Python?如何在 Python 中将列表分成大小交替的块?
【发布时间】:2021-02-06 11:24:23
【问题描述】:

我需要将一个字符串分成大小不等的块,也就是说,如果在 for 循环中我满足某个条件,那么该块应该具有特定的长度,否则具有不同的长度。基本上我需要创建一个二维数组(列表),我知道行数但不知道列数,因为字符串的长度是未知的。我尝试了各种谷歌搜索方法。这是我自己尝试过的。

    a = [1,2,3,4,5,6,7,8]
b = []
c=[]
def divide_chunks(l): 
      
    # looping till length l 
    for i in range(0, len(l)):
        j = 0
        if(i%2==0):
           while(j<4 and i<=len(l)):
               b.append(l.pop())
               i = i+1
        else:
              while(j<2 and i<=len(l)):
               b.append(l.pop())
               i = i+1
        c.append(b)    

我面临的问题是每个块中的数字或让我们说字符串的单词重叠。例如其中一个输出是

[[8, 7, 6, 5, 4, 3, 2], [8, 7, 6, 5, 4, 3, 2], [8, 7, 6, 5, 4, 3, 2 ], [8, 7, 6, 5, 4, 3, 2], [8, 7, 6, 5, 4, 3, 2], [8, 7, 6, 5, 4, 3, 2], [8, 7, 6, 5, 4, 3, 2], [8, 7, 6, 5, 4, 3, 2]]

所以我想实现类似 if string is markisgoodboy。然后对于第一行,它将采用“mark”第二行“is”和第三行“good”,第四行“bo”和最后一行“y”。请注意,它是行明智的。行的长度将作为每个方法调用的参数提供。如何解决? 谢谢:)

【问题讨论】:

  • 也许是我,但我不明白你是否要拆分字符串或列表,拆分条件,存储位置,条件何时适用,何时不适用,以及如何最后两个示例([8, 7, 6, 5, 4, 3, 2]markisgoodboy)与该问题有关。但除此之外……
  • @Mr.T 逻辑还是一样的吧?不管是字符串还是列表,我仍然会以我相信的方式循环遍历它。因此,如果我知道行数,那么我可以在 [0,0] 行中存储 4 个元素,在第一行中存储一个元素,第二行中再存储 4 个元素。所以 i%2 == 0 将是 oth 和 2 等等。如果您只是将字符串写成 4 行,例如 M a r k one below other ,那么这就是我想说的。谢谢你:)
  • 我们如何知道第 0 行有 4 个元素等?这些信息(标记似乎是@​​987654324@)存储在哪里?还是在列表/字符串用完之前总是 4-2?你的问题中没有提到这一点。关于列表或字符串 - 有些方法适用于两者,但其他方法仅适用于其中一个。
  • @Mr.T 对于每个方法调用,行的长度都是固定的,或者你可以说我知道行的长度,所以现在让我们将其视为 4。现在有多少字在后续行中将基于行数,所以让我们说类似 len(rows) - 2 。但现在让我们考虑 2。我们可以使它对 string 和 int list 通用吗?如果没有,让我们现在就为字符串做吧

标签: python python-3.x string list


【解决方案1】:

这应该适用于不包含空元素的列表和字符串:

def chunks(s, m, n):
    s1 = [s[i:i+m] for i in range(0, len(s), m+n)] 
    s2 = [s[i+m:i+m+n] for i in range(0, len(s), m+n)] 
    return [e for t in zip(s1, s2) for e in t if e]

s = '1234567890ABCDEFGHIJKLMNO'
m = 4
n = 2

print(chunks(list(s), m, n))
print(chunks(s, m, n))

样本输出:

[['1', '2', '3', '4'], ['5', '6'], ['7', '8', '9', '0'], ['A', 'B'], ['C', 'D', 'E', 'F'], ['G', 'H'], ['I', 'J', 'K', 'L'], ['M', 'N'], ['O']]
['1234', '56', '7890', 'AB', 'CDEF', 'GH', 'IJKL', 'MN', 'O']

【讨论】:

  • 谢谢,我一直在寻找什么。:) 你能解释一下这是如何工作的 -> s[i:i+m] 吗?我对 Python 比较幼稚。我知道它是用于切片,但需要了解上下文中的逻辑。
  • 语法是x[start:stop:step],所以在这种情况下,就是x[start:stop]s1 提取元素 (m+n)*i(m+n)*i+m-1s2 提取元素 (m+n)*i+m(m+n)*i+m+n-1i=0,1,2...。之后,zip 组合两个列表的交替元素。
  • 一定会的。
猜你喜欢
  • 2012-05-09
  • 2022-10-29
  • 1970-01-01
  • 2023-01-07
  • 2021-11-11
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多