如何将列表分成n个相等的部分,python

发布于 2024-10-01 17:54:06 字数 216 浏览 2 评论 0原文

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

x = len(lst)/10

如何给这些部分变量命名?

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

Given (any) list of words lst I should divide it into 10 equal parts.

x = len(lst)/10

how to give these parts variable names?

In the output I need 10 variables (part1, part2... part10) with x number of words in it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

春夜浅 2024-10-08 17:54:06

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

>>> 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]]

One-liner returning a list of lists, given a list and the chunk size:

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

Testing:

>>> 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]]

Update:

I think the question is really asking is a function which, given a list and a number, returns a list containing $(number) lists, with the items of the original list evenly distributed. So your example of lol(x, 7) should really return [[20,21,22], [23,24,25], [26,27], [28,29], [30,31], [32,33], [34,35]]. – markrian

Well, in this case, you can try:

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

I'm sure this can be improved but I'm feeling lazy. :-)

>>> slice_list(x, 7)
[[20, 21, 22], [23, 24, 25], 
 [26, 27], [28, 29], 
 [30, 31], [32, 33], 
 [34, 35]]
ま柒月 2024-10-08 17:54:06

为了达到与 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]]

To achieve the same result as Paulo's update (divide a list into n chunks with size only differing by 1), the following is an elegant solution using recursion.

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

Example:

lst = list(range(13))
print divide(lst,5) # [[0, 1], [2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
深府石板幽径 2024-10-08 17:54:06

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

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

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

See this question for how to generate equal chunks of a list. Then, if you really need them in separate variables, you can do:

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

But I would recommend making the code more general, instead of hardcoding it to 10 parts.

街角卖回忆 2024-10-08 17:54:06

我将编写这段代码以便您学习该技术,但您不应该这样做。像 listset 这样的容器数据类型的要点是,您可以拥有任意内容,而不必为每个元素创建变量。所以,

不要这样做

>>> 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 (或者实际上globalsvars)不是一个好的做法:它会导致难以确定的行为,并且可能会出现非常讨厌的错误。

I'll write this code so you learn the technique, but you shouldn't do this. The point of container datatypes like list and set is that you can have arbitrary contents without having to make variables for each elements. So,

Don't do this

>>> 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]

(The chunks recipe is from Ned Batchelder's answer in the linked question. The reason you shouldn't do this is that modifying locals (or indeed globals or vars) is not good practice: it causes hard-to-determine behaviour and possibly very nasty bugs.

同展鸳鸯锦 2024-10-08 17:54:06

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

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]]

希望它有帮助,而不是。

If you don't need to enforce contiguous pieces of output elements, then the following simple snippet will do the job:

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)
    ]

Basically the code is grouping elements based on modulo residues. And because of exactly that, the elements in the output list will not be contiguous. For example, if the input is range(21), instead of

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

you would get

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

Hope it helps.

羁客 2024-10-08 17:54:06

另一种选择

chunk_size=5
_chunks=list(x [i:i+chunk_size]
                   for i in range(0, len(x ), chunk_size))

Another alternative

chunk_size=5
_chunks=list(x [i:i+chunk_size]
                   for i in range(0, len(x ), chunk_size))
黒涩兲箜 2024-10-08 17:54:06

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

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

  1. 使用setattr并向任何对象添加新属性。这是安全的,因为您不会覆盖现有变量:
    res = 对象()
    ...
    setattr(res,“部分”+索引,part_ generated)
    
  2. 根据代码运行的上下文,将生成的变量添加到 locals()globals() 字典中。

Use tuple/list a result - the most reasonable approach

If you need to define new variables, you can

  1. use setattr and add new attributes to any object. It is safe since you won't overwrite existing variables:

    res = object()
    ...
    setattr(res, "part"+index, part_generated)
  2. add generated variables to locals() or globals() dictionary depending on the context your code is running in.
云巢 2024-10-08 17:54:06

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

# 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)

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

Seen several solutions, but couldn't help post mine:

# 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)

Can probably be summarized further, of course, but I think this way it is clear to read.

梦一生花开无言 2024-10-08 17:54:06

与数据帧的 @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]

Same as @henneray for dataframes

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]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文