根据字符串整数作为索引创建元组元素的嵌套列表
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']]
感谢您的帮助。
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 的情况下也是可能的。
假设我有一个包含列表的元组,其中它的第一个元素总是一个字符串数字,例如
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']]
感谢您的帮助。
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 的情况下也是可能的。