如何对嵌套列表结构中的所有值进行排序,以使子列表与原始列表中的长度相同,以便将值移至相应的子列表,以便对它们进行整体排序,而不仅仅是在每个子列表单独。怎么会这样呢??
例如:
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]]
感谢任何帮助
答案 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]]