如何在Python中将列表列表转换为组?

2024-06-28 18:56:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试解决一个练习,我有这样一个列表:

outerlist = [[344,0,"str1"],[233,0,"str2"],[213,0,"str3"],[344,2,"str4"],
             [213,1,"str5"],[344,3,"str6"],[344,1,"str7"],[213,2,"str8"]]

内部列表中的第二个元素总是连续增加的。你知道吗

想要这样的输出:

Group 1
213 0 str3
213 1 str5
213 2 str8
Group 2
233 0 str2
Group 3
344 0 str1
344 1 str7
344 2 str4
344 3 str6

首先,我考虑按列表的第一个元素进行分组,并编写了以下代码

list1 = []
list2 = []
list3 = []
for i in range(len(outerlist)):
    if outerlist[i][0] == 213:
        list1.append(outerlist[i])
    elif outerlist[i][0] == 233:
        list2.append(outerlist[i])
    elif outerlist[i][0] == 344:
        list3.append(outerlist[i])

但是outerlist可以有更多的内部列表作为元素,并且这些内部列表在第一个元素中可以有不同的元素(而不是只有213、233、344,它可以是579或1000,因此在输出中必须有一个group4和group5部分) 如果我能解决第一个问题,我就可以使用这些函数,而且组可以连续排序 我可以打印出来

def sortinlist(y):
    y.sort(key = lambda x: x[1])
    return y
def listtostr(y):
    return ' '.join(map(str, y)

但是我不知道在outerlist中会有多少个内部列表,我想找到一个代码,可以通过查找innerlist的第一个元素来检测id,为这个id创建一个新的列表,然后在第二个内部列表中查找第一个元素,如果它的id与第一个innerlist的id相同,那么就附加到group1list中,如果它没有,那么就创建一个新的列表,等等。基本上,我想找到一种方法,用示例结构给出输出。你知道吗


Tags: 代码id元素列表groupappendstr1str2
3条回答

使用集合和列表的解决方案:

labels = list({l[0] for l in outerlist})
sortedlist = sorted(outerlist) 
groups = [[l for l in sortedlist if l[0]==x] for x in sorted(labels)]

for  i,values in enumerate(groups):
    print("Group",i+1)
    for v in values:
        print(*v)

产生

Group 1
213 0 str3
213 1 str5
213 2 str8
Group 2
233 0 str2
Group 3
344 0 str1
344 1 str7
344 2 str4
344 3 str6

这看起来有点像一个家庭作业问题,所以我不打算为你做所有的,但我确实认为,通过使用字典,你将能够得到大部分的方式那里

这解决了

But outerlist can have more inner lists as elements, and these inner list can have different elements in first element (instead of only 213, 233 ,344 it could be 579 or 1000 thus in output there must be a group 4 and group 5 section) If I could solve this first problem I can use these functions, and groups can be ordered consecutively and I could print them

outerlist = [[344,0,"str1"],[233,0,"str2"],[213,0,"str3"],[344,2,"str4"],
             [213,1,"str5"],[344,3,"str6"],[344,1,"str7"],[213,2,"str8"]]

container = {}
for inner_list in outerlist:
    key_, ind_, string_ = inner_list

    if key_ in container:
        container[key_].append([ind_, string_])
    else:
        container[key_] = [[ind_, string_]]

此时,容器包含

{344: [[0, 'str1'], [2, 'str4'], [3, 'str6'], [1, 'str7']],
 233: [[0, 'str2']],
 213: [[0, 'str3'], [1, 'str5'], [2, 'str8']]}

然后您可以对其进行排序

我们到了

outerlist = [[344, 0, "str1"], [233, 0, "str2"], [213, 0, "str3"], [344, 2, "str4"],
             [213, 1, "str5"], [344, 3, "str6"], [344, 1, "str7"], [213, 2, "str8"]]
outerlist = sorted(outerlist, key=lambda x: x[1])

last_id, group_id = None, 0
for item in sorted(outerlist, key=lambda x: x[0]):
    if not last_id or item[0] != last_id:
        group_id += 1
        last_id = item[0]

        print('Group {}'.format(group_id))

    print(' '.join([str(x) for x in item]))

输出

python test.py
Group 1
213 0 str3
213 1 str5
213 2 str8
Group 2
233 0 str2
Group 3
344 0 str1
344 1 str7
344 2 str4
344 3 str6

For the case we don't have to build any extra lists or complex structures for printing.

相关问题 更多 >