2017-04-17 68 views
0

不确定如何在标题中以特殊方式表示。但是,让我们说,我有这样的元组:将元组划分为多个子元组 - Python

[['a',2,3],['a',4,5],['b',10,20],['b',30,40],['a',5,6]] 

如何划分这个解析成两个元:

a = [[2,3],[4,5],[5,6]] 
b = [[10,20],[30,40]] 
+4

这些被称为列表btw –

+1

你有什么试过,究竟是什么问题呢?用字母“a”和“b”可能会更好。 – jonrsharpe

回答

1

假设'a''b'是值得被硬编码有意义的常数,一个简单的解决方案:

arr = [['a',2,3],['a',4,5],['b',10,20],['b',30,40],['a',5,6]] 
a = [l[1:] for l in arr if l[0] == 'a'] 
b = [l[1:] for l in arr if l[0] == 'b'] 

如果需要一个比较通用代码:

from collections import defaultdict 

arr = [['a',2,3],['a',4,5],['b',10,20],['b',30,40],['a',5,6]] 

d = defaultdict(list) 
for l in arr: 
    d[l[0]].append(l[1:]) 
0

你可以做,使用列表理解:

>>> l = [['a',2,3],['a',4,5],['b',10,20],['b',30,40],['a',5,6]] 

>>> a = [x[1:] for x in l if x[0] == "a"] 

>>> a 
[[2, 3], [4, 5], [5, 6]] 

>>> b = [x[1:] for x in l if x[0] == "b"] 

>>> b 
[[10, 20], [30, 40]] 

>>> 

您需要遍历在主列表中的元素(子表)。对于每个子列表,我们检查第一个项目。如果第一项是ab,那么我们对子列表进行切片并仅取整数部分。

0

正如jonrsharpe所说,将这些列表存储在字典中可能更有用。使用字典将子列表以您想要的方式进行划分很容易,可以将列表作为以字符串为键的值累积到列表中。当然,如果你真的想要的话,你可以将结果列表绑定到不同的名字上。

seq = [['a', 2, 3], ['a', 4, 5], ['b', 10, 20], ['b', 30, 40], ['a', 5, 6]] 
d = {} 
for k, *u in seq: 
    d.setdefault(k, []).append(u) 

print(d) 
a = d['a'] 
b = d['b'] 
print(a) 
print(b) 

输出

{'a': [[2, 3], [4, 5], [5, 6]], 'b': [[10, 20], [30, 40]]} 
[[2, 3], [4, 5], [5, 6]] 
[[10, 20], [30, 40]] 

for k, *u in seq:在每个子列表中的串结合k,存储该子列表作为u的剩余部分。然后,我们将u子列表附加到字典d的相应列表中。

+0

谢谢!将列表存储到字典中可能是我正在工作的最优雅的解决方案。 – user3150126