13

给定(任何)单词列表,lst我应该将其分成 10 个相等的部分。

x = len(lst)/10

如何给这些部分变量名?

在输出中,我需要 10 个变量 ( part1, part2... part10),其中x包含单词数。

4

9 回答 9

34

给定列表和块大小的单行返回列表列表:

>>> lol = lambda lst, sz: [lst[i:i+sz] for i in range(0, len(lst), sz)]

测试:

>>> x = range(20, 36)
>>> print x
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]

>>> lol(x, 4)
[[20, 21, 22, 23], 
 [24, 25, 26, 27], 
 [28, 29, 30, 31], 
 [32, 33, 34, 35]]

>>> lol(x, 7)
[[20, 21, 22, 23, 24, 25, 26], 
 [27, 28, 29, 30, 31, 32, 33], 
 [34, 35]]

更新:

我认为这个问题真正要问的是一个函数,它给定一个列表和一个数字,返回一个包含 $(number) 列表的列表,原始列表中的项目均匀分布。所以你的 lol(x, 7) 例子应该真的返回 [[20,21,22], [23,24,25], [26,27], [28,29], [30,31], [32 ,33]、[34,35]]。– 马克里安

好吧,在这种情况下,您可以尝试:

def slice_list(input, size):
    input_size = len(input)
    slice_size = input_size / size
    remain = input_size % size
    result = []
    iterator = iter(input)
    for i in range(size):
        result.append([])
        for j in range(slice_size):
            result[i].append(iterator.next())
        if remain:
            result[i].append(iterator.next())
            remain -= 1
    return result

我确信这可以改进,但我感到很懒惰。:-)

>>> slice_list(x, 7)
[[20, 21, 22], [23, 24, 25], 
 [26, 27], [28, 29], 
 [30, 31], [32, 33], 
 [34, 35]]
于 2010-11-07T18:51:48.800 回答
3

为了达到与 Paulo 的更新相同的结果(将列表划分为 n 个大小仅相差 1 的块),以下是使用递归的优雅解决方案。

def divide(lst, n):
    p = len(lst) // n
    if len(lst)-p > 0:
        return [lst[:p]] + divide(lst[p:], n-1)
    else:
        return [lst]

例子:

lst = list(range(13))
print divide(lst,5) # [[0, 1], [2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
于 2018-03-09T04:04:15.657 回答
2

请参阅此问题以了解如何生成相等的列表块。然后,如果你真的需要它们在单独的变量中,你可以这样做:

part1, part2, ..., part10 = (part for part in chunks(lst, len(lst)/10))

但我建议使代码更通用,而不是将其硬编码为 10 个部分。

于 2010-11-07T18:43:09.770 回答
1

我将编写此代码以便您学习该技术,但您不应该这样做。容器数据类型的意义list在于set,您可以拥有任意内容,而无需为每个元素创建变量。所以,

不要这样做

>>> def chunks(l, n):
...     for i in xrange(0, len(l), n):
...         yield l[i:i+n]
...
>>> for i, chunk in enumerate(chunks(range(100), 10)):
...     locals()["part{0}".format(i)] = chunk
...
>>> part0
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> part1
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> part2
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

chunks配方来自Ned Batchelder在链接问题中的回答。您不应该这样做的原因是修改locals(或实际上是globalsor vars)不是好的做法:它会导致难以确定的行为和可能非常讨厌的错误。

于 2010-11-07T18:51:04.823 回答
1

如果您不需要强制执行连续的输出元素,那么以下简单的代码片段将完成这项工作:

def even_divide(lst, num_piece=4):
    return [
        [lst[i] for i in range(len(lst)) if (i % num_piece) == r]
        for r in range(num_piece)
    ]

基本上,代码是基于模残基对元素进行分组。正因为如此,输出列表中的元素不会是连续的。例如,如果输入是range(21),而不是

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

你会得到

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

希望能帮助到你。

于 2016-08-11T23:00:33.280 回答
0

使用元组/列出结果 - 最合理的方法

如果需要定义新变量,可以

  1. 使用setattr并将新属性添加到任何object. 这是安全的,因为您不会覆盖现有变量:
    资源 = 对象()
    ...
    setattr(res, "part"+index, part_generated)
    
  2. 根据您的代码运行的上下文将生成的变量添加到locals()或字典中。globals()
于 2010-11-07T18:56:14.873 回答
0

看到了几个解决方案,但无法帮助发布我的:

# List
lst = range(103)

# number of slices
nSlices = 10

# splitted list
slices = [len(lst) // (nSlices)] * nSlices

# but points are still missing!
remainder = len(lst)-sum(slices)

# split missing points across slices
slices[:remainder] = [ii + 1 for ii in slices[:remainder]]

splittedList = [lst[sum(slices[:ii]):sum(slices[:ii+1])] for ii in                range(nSlices)]
print lst
print '\n'.join("{}".format(n) for n in splittedList)

当然,可能可以进一步总结,但我认为这种方式阅读起来很清楚。

于 2016-06-18T21:21:32.420 回答
0

另一种选择

chunk_size=5
_chunks=list(x [i:i+chunk_size]
                   for i in range(0, len(x ), chunk_size))
于 2021-08-28T17:03:52.667 回答
0

与数据帧的@henneray 相同

def divide_df(df, n):    
    p = len(df.index) // n # size of one part is length / parts
    if len(df.index) - p > 0: # if a part of size p is still remaining
        return [df.iloc[0:p]] + divide(df.iloc[p:], n-1) # one part is from start to p, recursivly divide rest into n-1 pieces
    else:
        return [df]
于 2021-03-23T14:08:43.007 回答