Python 如何根据第一个元素对嵌套列表进行分组?

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

我有一个嵌套列表,其中包含要基于嵌套列表的第一个元素进行分组的字符串。在对它们进行分组之后,我想删除所有重复的第一个元素,并将列表转换为一个用分号分隔的简单字符串

到目前为止,我所做的是输出简单字符串以及删除重复的第一个元素。为此,我将列表的第一个元素保存在一个新的空列表中,并使用if/else语句决定向新的输出列表追加什么

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.,你有我的奖金解决方案,享受吧