Python 通过增加数字对嵌套列表进行排序

Python 通过增加数字对嵌套列表进行排序,python,Python,如何对嵌套列表结构中的所有值进行排序,以使子列表的长度与原始列表中的长度相同,并使值移动到适当的子列表,从而使它们整体排序,而不仅仅是在每个子列表中单独排序。这是怎么回事 例如: list1=[[0.10, 0.90, 0,20], [0.15, 0.80], [0.68, 0.08, 0.30]] 变成: list1=[[0.08, 0.10, 0.15], [0.20, 0.30], [0.68, 0.80, 0.90]] 非常感谢您的帮助这很有效 list1=[[0.10, 0.90,

如何对嵌套列表结构中的所有值进行排序,以使子列表的长度与原始列表中的长度相同,并使值移动到适当的子列表,从而使它们整体排序,而不仅仅是在每个子列表中单独排序。这是怎么回事

例如:

list1=[[0.10, 0.90, 0,20], [0.15, 0.80], [0.68, 0.08, 0.30]]
变成:

list1=[[0.08, 0.10, 0.15], [0.20, 0.30], [0.68, 0.80, 0.90]]
非常感谢您的帮助

这很有效

list1=[[0.10, 0.90, 0.20], [0.15, 0.80], [0.68, 0.08, 0.30]]

list_lengths = [len(x) for x in list1]
flattened = [item for items in list1 for item in items]
items_sorted = sorted(flattened)

loc = 0
lists2 = []
for length in list_lengths:
    lists2.append(items_sorted[loc:loc+length])
    loc += length

print(lists2)
您需要在某个时刻获取列表长度,以构建最终列表2。为了正确地获得有序值,您可以展平列表并对其排序,然后通过切片已排序的项目将列表添加到列表2中


请注意,这将适用于任意长度的列表和元组。

类似于@Evan的答案

import itertools
import numpy as np

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)

list1=[[0.10, 0.90, 0.20], [0.15, 0.80], [0.68, 0.08, 0.30]]

# get the sizes of each of the sublists and where they start
sizes = [len(l) for l in list1]
sizes.insert(0,0)
offsets = np.cumsum(sizes)

# flatten and sort
flat_list = sorted(itertools.chain(*list1))

nested = [flat_list[begin:end] for begin, end in pairwise(offsets)]
print(nested)

为此,我将使用
itertools
,并将整个过程限制在一个函数中:

import itertools


def join_sort_slice(iterable):
    it = iter(sorted(itertools.chain(*iterable)))
    output = []
    for i in map(len, iterable):
        output.append(list(itertools.islice(it, i)))
    return output
使用它:

lst = [[0.10, 0.90, 0.20], [0.15, 0.80], [0.68, 0.08, 0.30]]
join_sort_slice(lst)
# [[0.08, 0.1, 0.15], [0.2, 0.3], [0.68, 0.8, 0.9]]
其思想是将所有子列表链接在一起,然后对结果进行排序。然后根据原始列表的长度对排序后的输出进行切片


我希望这能有所帮助。

itertools的另一个变体:

import itertools

list1=[[0.10, 0.90, 0.20], [0.15, 0.80], [0.68, 0.08, 0.30]]
sorted_l = sorted(itertools.chain.from_iterable(list1))
result = []
k=0
for i in (len(i) for i in list1):
    result.append(sorted_l[k:k+i])
    k=k+i

print(result)
输出:

[[0.08, 0.1, 0.15], [0.2, 0.3], [0.68, 0.8, 0.9]]
您可以使用链接列表、对列表进行排序并创建迭代器。然后,您可以在原始列表上进行迭代,并使用以下方法创建结果:


到目前为止你试过什么?您知道
.sort
方法和
sorted
函数的
参数吗?您加入它们,对它们进行排序,然后对它们进行拆分。另外,您确定需要该输出吗?这根本没什么意义。嗨,谢谢你的意见。这只是问题的一部分。我做了一个循环,可以写出这样的随机嵌套列表(带有随机数)。我想以递增的顺序将它们写入一个文件。所有问题都应该在问题中描述
>>> from itertools import chain
>>> l = [[0.10, 0.90, 0.20], [0.15, 0.80], [0.68, 0.08, 0.30]]
>>> it = iter(sorted(chain.from_iterable(l)))
>>> [[next(it) for _ in l2] for l2 in l]
[[0.08, 0.1, 0.15], [0.2, 0.3], [0.68, 0.8, 0.9]]