Python 如何根据第一个元素对嵌套列表进行分组?
我有一个嵌套列表,其中包含要基于嵌套列表的第一个元素进行分组的字符串。在对它们进行分组之后,我想删除所有重复的第一个元素,并将列表转换为一个用分号分隔的简单字符串 到目前为止,我所做的是输出简单字符串以及删除重复的第一个元素。为此,我将列表的第一个元素保存在一个新的空列表中,并使用if/else语句决定向新的输出列表追加什么Python 如何根据第一个元素对嵌套列表进行分组?,python,python-3.x,list,Python,Python 3.x,List,我有一个嵌套列表,其中包含要基于嵌套列表的第一个元素进行分组的字符串。在对它们进行分组之后,我想删除所有重复的第一个元素,并将列表转换为一个用分号分隔的简单字符串 到目前为止,我所做的是输出简单字符串以及删除重复的第一个元素。为此,我将列表的第一个元素保存在一个新的空列表中,并使用if/else语句决定向新的输出列表追加什么 exampleinput = ["[['1','2','3'],['1','4','6'],['2','1','2'],['3','4','2'], ['1','2','5
exampleinput = ["[['1','2','3'],['1','4','6'],['2','1','2'],['3','4','2'], ['1','2','5'],['1','7','8']]"]
def makestring(n):
str1 = ' '.join(n)
return str1
def transform(n):
first = []
output = []
for i in n:
if i[0] not in first:
output.append(makestring(i))
else:
string1 = makestring(i[1:])
output.append(string1)
first.append(i[0])
return output
for i in exampleinput:
print(transform(eval(i.strip())))
输入示例:
[['1','2','3'],['1','4','6'],['2','1','2'],['3','4','2'],['1','2','5'],['1','7','8']]
['1 2 3 ; 4 6 ; 2 5 ; 7 8', '2 1 2', ' 3 4 2']
['1 2 3', '4 6', '2 1 2', '3 4 2, '2 5', '7 8']
所需输出:
[['1','2','3'],['1','4','6'],['2','1','2'],['3','4','2'],['1','2','5'],['1','7','8']]
['1 2 3 ; 4 6 ; 2 5 ; 7 8', '2 1 2', ' 3 4 2']
['1 2 3', '4 6', '2 1 2', '3 4 2, '2 5', '7 8']
实际输出:
[['1','2','3'],['1','4','6'],['2','1','2'],['3','4','2'],['1','2','5'],['1','7','8']]
['1 2 3 ; 4 6 ; 2 5 ; 7 8', '2 1 2', ' 3 4 2']
['1 2 3', '4 6', '2 1 2', '3 4 2, '2 5', '7 8']
有什么想法吗?提前谢谢 您将按照给定的顺序追加到输出,而不是追加到字符串1。以下是我要使用的代码:
exampleinput = ["[['1','2','3'],['1','4','6'],['2','1','2'],['3','4','2'], ['1','2','5'],['1','7','8']]"]
def makestring(i):
return "".join(i)
def main(i):
string1 = ""
first = ["1"] # for (123)
output = []
string1 += makestring(i[0])
for x in i[1:]:
if x[0] in first:
string1 += " ; "+makestring(x[1:])
else:
output.append(makestring(x))
first.append(x[0])
return [string1] + output
if __name__ == "__main__":
print(main(eval(exampleinput[0].strip())))
这将返回输出:
['123;46;25;78','212','342']具有以下功能:
from itertools import groupby
inp_list = [['1','2','3'],['1','4','6'],['2','1','2'],['3','4','2'],['1','2','5'],['1','7','8']]
res = []
for k, g in groupby(sorted(inp_list, key=lambda x: x[0]), key=lambda x: x[0]):
item1, *rest = g
res.append('; '.join(map(' '.join, [item1] + [i[1:] for i in rest]))
if rest else ' '.join(item1))
print(res)
输出:
['1 2 3; 4 6; 2 5; 7 8', '2 1 2', '3 4 2']
奖金仅使用辅助分组字典的解决方案:
inp_list = [['1','2','3'],['1','4','6'],['2','1','2'],['3','4','2'],['1','2','5'],['1','7','8']]
groups_dict = {}
for sub_l in inp_list:
if sub_l[0] not in groups_dict:
groups_dict[sub_l[0]] = ' '.join(sub_l)
else:
groups_dict[sub_l[0]] += '; ' + ' '.join(sub_l[1:])
res = list(groups_dict.values())
print(res) # ['1 2 3; 4 6; 2 5; 7 8', '2 1 2', '3 4 2']
首先,我使用join方法创建一个字符串列表
signal = [['1','2','3'],['1','4','6'],['2','1','2'],['3','4','2'],['1','2','5'],['1','7','8']]
my_list =[" ".join(x) for x in [y for y in signal] ]
然后搜索列表,从结尾到开始,再到比较。如果字符串的第一个字符为true,并且不是相同的项目和索引,则该字符串的第一个字符位于其他项目中
大于所选项目的项目,然后将其删除
for i in range(len(my_list)-1,0,-1):
for j in my_list:
if my_list[i][0] == j[0] and my_list[i] != j and i > my_list.index(j):
my_list[i]= my_list[i][1:]
print(my_list)
输出:
['1 2 3', ' 4 6', '2 1 2', '3 4 2', ' 2 5', ' 7 8']
嗨,谢谢你的解决方案!如果没有导入的函数,执行此操作是否会有所不同/更加困难?我还是Python新手,我想了解解决这样一个问题的思维过程。@MatthewK.,你有我的奖金解决方案,享受吧