我正在尝试获取列表中相同的第一个元素并将其指定为列表的第一个元素。我被告知可以通过使用collections模块中的defaultdict来完成,但有一种方法可以在不使用Collections库的情况下完成此操作。
我有什么:
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]]]
答案 0 :(得分:1)
您应该使用 dict / 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,如果键不在dict中,则会添加一个列表作为值,如果它存在,则只需附加值。
答案 1 :(得分: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]]}