通过增加数字

时间:2017-09-29 14:34:46

标签: 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]]

感谢任何帮助

5 个答案:

答案 0 :(得分:3)

这很有效。

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。为了正确获取您的有序值,您将列表展平并排序,然后通过切分已排序的项目将列表添加到list2。

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

答案 1 :(得分:2)

您可以使用chain.from_iterable链接列表,对它们进行排序并创建迭代器。然后,您可以迭代原始列表并使用next创建结果:

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

答案 2 :(得分:1)

我会将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]]

想法是将chain所有子列表放在一起,然后对结果进行排序。然后根据原始列表列表的长度对此排序输出进行切片。

我希望这会有所帮助。

答案 3 :(得分:0)

与@Evan的回答类似

var person = {}
person.age = 0
person.myMethod = function() {
}

答案 4 :(得分:0)

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