2016-07-27 202 views
0

我想将列表中的第一个元素取为相同的第一个元素并将其指定为列表的第一个元素。我被告知它可以通过使用默认集合模块完成,但有没有一种方法可以做到这一点,而不使用集合库。采取相同的第一个元素的列表,并将其指定为python列表的第一个元素

我有:

mapping = [['Tom', 'BTPS 1.500 625', 0.702604], ['Tom', 'BTPS 2.000 1225', 0.724939], ['Max', 'OBL 0.0 421', 0.766102], ['Max', 'DBR 3.250 721', 0.887863]] 

我所期待的事:

mapping = [['Tom',[ 'BTPS 1.500 625', 0.702604], [ 'BTPS 2.000 1225', 0.724939]],['Max',[ 'OBL 0.0 421', 0.766102],['DBR 3.250 721', 0.887863]]] 

回答

1

您应该按名称使用字典/defaultdict对数据进行分组,使用的第一个元素,其是作为名称的关键,将其余数据切片并附加为数值:

from collections import defaultdict 

d = defaultdict(list) 
for sub in mapping: 
    d[sub[0]].append(sub[1:]) 

print(d) 

这将使你:

defaultdict(<type 'list'>, {'Max': [['OBL 0.0 421', 0.766102], ['DBR 3.250 721', 0.887863]], 'Tom': [['BTPS 1.500 625', 0.702604], ['BTPS 2.000 1225', 0.724939]]}) 

或订单问题,使用OrderedDict

from collections import OrderedDict 

d = OrderedDict() 
for sub in mapping: 
    d.setdefault(sub[0],[]).append(sub[1:]) 

这就给了你:

OrderedDict([('Tom', [['BTPS 1.500 625', 0.702604], ['BTPS 2.000 1225', 0.724939]]), ('Max', [['OBL 0.0 421', 0.766102], ['DBR 3.250 721', 0.887863]])]) 

没有任何进口,只是使用普通的字典再次使用dict.setdefault

d = {} 
for sub in mapping: 
    d.setdefault(sub[0],[]).append(sub[1:]) 

print(d) 

使用setdefault,如果键不在字典中,它会添加一个列表作为值,如果它存在,它只是附加值。

+0

感谢Padraic提供了如此快速的响应。有没有必要导入收集模块? –

+0

@Ghale-Boong,是的,我会编辑 –

0

您可以遍历映射中的名称并添加到字典中。

mapping = [['Tom', 'BTPS 1.500 625', 0.702604], ['Tom', 'BTPS 2.000 1225', 0.724939], ['Max', 'OBL 0.0 421', 0.766102], ['Max', 'DBR 3.250 721', 0.887863]] 

#using dictionary to store output 
mapping_dict=dict() 

for items in mapping: 
if items[0] in mapping_dict: 
    mapping_dict[items[0]].append([items[1],items[2]]) 
else: 
    mapping_dict[items[0]]=[items[1],items[2]] 

print mapping_dict 

Output: {'Max': ['OBL 0.0 421', 0.766102, ['DBR 3.250 721', 0.887863]], 'Tom': ['BTPS 1.500 625', 0.702604, ['BTPS 2.000 1225', 0.724939]]} 
相关问题