根据字符串整数作为索引创建元组元素的嵌套列表

Create nested list of tuple elements based on the string integer number as index

假设我有一个包含列表的元组,其中它的第一个元素总是一个字符串数字,例如

asdf = (['0', ...], ['1', ...], ['2', ...], ['3.0', ...], ['3.1', ...], ['3.2', ...], ['4', ...] , ['5.0', ...], ['5.1', ...])

基本上,我想要一个列表,其中包含元组列表的所有字符串编号。

但是,如果每个列表的第一个值包含一个子索引(在本例中为 3.0, 3.1, 3.2 and 5.0, 5.1),我想将这些子值放在一个子列表中。此示例中的结果应如下所示。

Result = ['0', '1', '2', ['3.0', '3.1', '3.2'], '4', ['5.0', '5.1']]

感谢您的帮助。

使用itertools.groupby,

import operator
import itertools

tuples = (['0', ], ['1', ], ['2', ], ['3.0', ], ['3.1', ], ['3.2', ], ['4', ] , ['5.0', ], ['5.1', ])

l = map(operator.itemgetter(0), tuples)
# ['0', '1', '2', '3.0', '3.1', '3.2', '4', '5.0', '5.1']

results = list()
for name, group in itertools.groupby(l, key=lambda x:x.split('.')[0]):
    tmp_list = list(group)
    results.append(tmp_list[0] if len(tmp_list)==1 else tmp_list)

print(results)
# Output
['0', '1', '2', ['3.0', '3.1', '3.2'], '4', ['5.0', '5.1']]

您也可以不使用 itertools.groupby()。您可以使用这样的排序 method/defaultdict 方法:

from collections import defaultdict

asdf = (['0', ], ['1', ], ['2', ], ['3.0', ], ['3.1', ], ['3.2', ], ['4', ] , ['5.0', ], ['5.1', ])

all_items = [x[0] for x in asdf]

d = defaultdict(list)

for item in all_items:
    key = item[0]
    d[key].append(item)

values = [x[1] for x in sorted(d.items())]

result = []
for lst in values:
    if len(lst) == 1:
        result.append(lst[0])
    else:
        result.append(lst)
print(result)

输出:

['0', '1', '2', ['3.0', '3.1', '3.2'], '4', ['5.0', '5.1']]

这在没有 defaultdicts 的情况下也是可能的。