关于python:如何根据这些项目是否在另一个列表中,从一个项目到另一个项目对列表中的内容进行分组?

How to group contents in a list from item to item based on whether those items are in another list?

我有以下列表:

1
x = ['0001', 'Random message XYX', 'Random second message IAI', '0002', 'Random message IAM', 'Random second message OMA', 'Random third message OMA', '0003', 'Random message XAK', 'Random second message YAB', '0004', ' Random message INA']

我还有另一张单子

1
y = ['0001', '0002', '0003', '0004']

我希望根据组Y对列表X进行分组,以便输出为:

1
x = [['0001', 'Random message XYX', 'Random second message IAI'], ['0002', 'Random message IAM', 'Random second message OMA', 'Random third message OMA'], ['0003', 'Random message XAK', 'Random second message YAB'], ['0004', ' Random message INA']]

我尝试过:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
x = ['0001', 'Random message XYX', 'Random second message IAI', '0002', 'Random message IAM', 'Random second message OMA', 'Random third message OMA', '0003', 'Random message XAK', 'Random second message YAB', '0004', ' Random message INA']

y = ['0001', '0002','0003', '0004']

grouped_list = []
for entry in x:
    if entry in y:
        new_list = []
        new_list.append(entry)
        for i in range(x.index(entry)+1, len(x)):
            if(x[i][0] not in y):
                new_list.append(x[i])
            else:
                break
        grouped_list.append(list(new_list))
print (grouped_list)

不过,这只是打印出[]

有人能告诉我需要做什么来打印我想要的输出吗?

编辑:

我使用Y.Luis的答案做了一些修改,这对这个例子很有效,但是我在使用实际数据时发现了一个问题。我在两个列表中都有重复的条目,这导致它覆盖了x列表中的数据,而不仅仅是将其分组。如果运行此代码,将覆盖X列表的最后一部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
x = ['0001', 'Random message XYX', 'Random second message IAI', '0002', 'Random message IAM', 'Random second message OMA', 'Random third message OMA', '0003', 'Random message XAK', 'Random second message YAB', '0004', ' Random message INA', '0001', 'Random message ryryry', 'Random second message ryyryyryryry']

y = ['0001', '0002','0003', '0004', '0001', '0002']

grouped_list = []
for entry in x:
    if entry in y:
        new_list = []
        new_list.append(entry)
        for i in range(x.index(entry)+1, len(x)):
            if(x[i] not in y):
                new_list.append(x[i])
            else:
                break
        grouped_list.append(list(new_list))
print (grouped_list)

有人能告诉我如何避免这种情况吗?


两条班轮怎么样?(抱歉,不能一行完成)

1
2
3
4
5
6
7
8
# At the top of your .py file    
from __future__ import print_function

x = ['0001', 'Random message XYX', 'Random second message IAI', '0002', 'Random message IAM', 'Random second message OMA', 'Random third message OMA', '0003', 'Random message XAK', 'Random second message YAB', '0004', ' Random message INA']
y = ['0001', '0002', '0003', '0004']

indexes = [k for k in [x.index(toks) for toks in y]]
print([x[i:j] for i, j in zip(indexes, indexes[1:]+[len(x)])])

给我

1
2
3
4
5
6
7
[['0001', 'Random message XYX', 'Random second message IAI'],
 ['0002',
  'Random message IAM',
  'Random second message OMA',
  'Random third message OMA'],
 ['0003', 'Random message XAK', 'Random second message YAB'],
 ['0004', ' Random message INA']]


您的最内部的if中有一个错误:

1
if(x[i][0] not in y):

这里您检查项目的第一个字符是否在列表中。应该是:

1
if(x[i] not in y):

如果要避免组键重复,可以使用字典:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
grouped_list = []
d = {}
i = 0
current_key = None

while i < len(x):

    if x[i] in y:
        current_key = x[i]
        if not d.has_key(current_key):
            d[current_key] = []
        i += 1
        continue

    while i < len(x) and x[i] not in y:
        d[current_key].append(x[i])
        i += 1

for k in d:
    grouped_list.append([k] + d[k])

print (grouped_list)