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']] |
您的最内部的
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) |