在python中,获取列表中相同的第一个元素并将其指定为列表的第一个元素

2024-04-27 20:02:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试获取列表中相同的第一个元素,并将其指定为列表的第一个元素。我被告知可以通过使用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]]]

Tags: 模块方法元素列表collectionsmappingmaxtom
2条回答

您应该使用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再次使用常规dict:

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

print(d)

使用setdefault,如果该键不在dict中,则会添加一个列表作为值,如果它确实存在,则只会附加值

您可以循环映射中的名称并添加到字典

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]]}

相关问题 更多 >