如何解压列表中列表中的列表
How to unzip lists in lists in a list
我有一个如下所示的数据集:
data = [ [[a,b],[a,d]], [[e,f],[g,h]], [[i,j],[k,j]] ]
我想解压缩它,所以我有:
[[a,a], [e,g], [i,k]] and [[b,d], [f,h], [j,j]]
同理,有没有一种方法可以获取列表的长度,而不用根据一个值计算重复项?例如,使用上面的第一个列表,我想计算每个子列表中列表的数量,而不计算第二个值中的重复项。所以我想得到:
[2, 2, 1]
我可以使用以下方法获得 [2, 2, 2] 的结果:
count = [len(i) for i in data]
但是因为我不能分开这些值,所以无法单独检查第二个值中的重复项。
>>> d = [ [[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]] ]
>>> list(zip(*[list(zip(*x)) for x in d]))
[((1, 3), (5, 7), (9, 11)), ((2, 4), (6, 8), (10, 12))]
或者用你的例子:
>>> d = [[['a', 'b'], ['a', 'd']], [['e', 'f'], ['g', 'h']], [['i', 'j'], ['k', 'j']]]
>>> list(zip(*[list(zip(*x)) for x in d]))
[(('a', 'a'), ('e', 'g'), ('i', 'k')), (('b', 'd'), ('f', 'h'), ('j', 'j'))]
至于你的计数,因为你只想查看第二个值,你可以将它们过滤掉,创建一组它们以去除重复值,然后对它们进行计数:
>>> [len(set(x[1] for x in y)) for y in d]
[2, 2, 1]
要转置您的子列表:
data = [ [["a","b"],["a","d"]], [["e","f"],["g","h"]], [["i","j"],["k","j"]] ]
a,b = (map(list,zip(*(map(list, zip(*sub)) for sub in data))))
print(a,b)
[['a', 'a'], ['e', 'g'], ['i', 'k']] [['b', 'd'], ['f', 'h'], ['j', 'j']]
要获得计数,您可以使用集合:
print([len(set(map(itemgetter(1), sub)) )for sub in data])
[2, 2, 1]
一组不适用于两个以上的子列表,即:
data = [[["a", "b"], ["a", "d"]], [["e", "f"], ["g", "h"]], [["i", "j"], ["k", "j"], ["A", "K"], ["B", "K"]]]
from collections import Counter
from operator import itemgetter
print([sum(v == 1 for v in Counter(map(itemgetter(1), sub)).values()) for sub in data])
[2, 2, 0]
如果您使用包含最后数据的集合,您会得到 [2, 2, 2]
,我认为这是错误的,因为没有唯一值
这个答案不使用映射或列表推导式,而是直接使用 for 循环。
data = [ [[a,b],[a,d]], [[e,f],[g,h]], [[i,j],[k,j]] ]
zip0 = []
zip1 = []
sub0=[]
sub1=[]
for x in data:
for y in x:
sub0.append(y[0])
sub1.append(y[1])
zip0.append(sub0)
zip1.append(sub1)
sub0 = []
sub1 = []
print zip0
print zip1
我有一个如下所示的数据集:
data = [ [[a,b],[a,d]], [[e,f],[g,h]], [[i,j],[k,j]] ]
我想解压缩它,所以我有:
[[a,a], [e,g], [i,k]] and [[b,d], [f,h], [j,j]]
同理,有没有一种方法可以获取列表的长度,而不用根据一个值计算重复项?例如,使用上面的第一个列表,我想计算每个子列表中列表的数量,而不计算第二个值中的重复项。所以我想得到:
[2, 2, 1]
我可以使用以下方法获得 [2, 2, 2] 的结果:
count = [len(i) for i in data]
但是因为我不能分开这些值,所以无法单独检查第二个值中的重复项。
>>> d = [ [[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]] ]
>>> list(zip(*[list(zip(*x)) for x in d]))
[((1, 3), (5, 7), (9, 11)), ((2, 4), (6, 8), (10, 12))]
或者用你的例子:
>>> d = [[['a', 'b'], ['a', 'd']], [['e', 'f'], ['g', 'h']], [['i', 'j'], ['k', 'j']]]
>>> list(zip(*[list(zip(*x)) for x in d]))
[(('a', 'a'), ('e', 'g'), ('i', 'k')), (('b', 'd'), ('f', 'h'), ('j', 'j'))]
至于你的计数,因为你只想查看第二个值,你可以将它们过滤掉,创建一组它们以去除重复值,然后对它们进行计数:
>>> [len(set(x[1] for x in y)) for y in d]
[2, 2, 1]
要转置您的子列表:
data = [ [["a","b"],["a","d"]], [["e","f"],["g","h"]], [["i","j"],["k","j"]] ]
a,b = (map(list,zip(*(map(list, zip(*sub)) for sub in data))))
print(a,b)
[['a', 'a'], ['e', 'g'], ['i', 'k']] [['b', 'd'], ['f', 'h'], ['j', 'j']]
要获得计数,您可以使用集合:
print([len(set(map(itemgetter(1), sub)) )for sub in data])
[2, 2, 1]
一组不适用于两个以上的子列表,即:
data = [[["a", "b"], ["a", "d"]], [["e", "f"], ["g", "h"]], [["i", "j"], ["k", "j"], ["A", "K"], ["B", "K"]]]
from collections import Counter
from operator import itemgetter
print([sum(v == 1 for v in Counter(map(itemgetter(1), sub)).values()) for sub in data])
[2, 2, 0]
如果您使用包含最后数据的集合,您会得到 [2, 2, 2]
,我认为这是错误的,因为没有唯一值
这个答案不使用映射或列表推导式,而是直接使用 for 循环。
data = [ [[a,b],[a,d]], [[e,f],[g,h]], [[i,j],[k,j]] ]
zip0 = []
zip1 = []
sub0=[]
sub1=[]
for x in data:
for y in x:
sub0.append(y[0])
sub1.append(y[1])
zip0.append(sub0)
zip1.append(sub1)
sub0 = []
sub1 = []
print zip0
print zip1