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

时间:2019-09-08 14:17:37

标签: python python-3.x list

我有一个嵌套列表,其中包含要根据嵌套列表的第一个元素进行分组的字符串。将它们分组后,我然后要删除所有重复的第一个元素,并将列表转换为以分号分隔的简单字符串。

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

psql -Upostgres -dtemplate0

示例输入:

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

有什么想法吗?预先感谢!

3 个答案:

答案 0 :(得分:2)

具有itertools.groupby功能:

['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']

仅使用辅助分组字典的

Bonus 解决方案:

Dim jsScript As String = $"<js><![CDATA[document.all(""login-email"").value = '{TextBox1.Text}';]]></js>.Value"

答案 1 :(得分:0)

不是将字符串追加到字符串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']

答案 2 :(得分:0)

首先,我使用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] ]

然后从头到尾搜索列表,直到比较该字符串的第一个字符在其他项目中(如果为真且与该项目和索引都不相同)  大于所选项目的项目,然后将其删除。

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