我正在尝试解决一个练习,我有一个这样的列表列表:
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])
但是外部列表可以具有更多的内部列表作为元素,并且这些内部列表可以在第一个元素中具有不同的元素(而不是只有213、233、344可以是579或1000,因此在输出中必须有一个组4和组5节) 如果可以解决第一个问题,则可以使用这些功能,并且可以连续订购组 我可以打印出来
def sortinlist(y):
y.sort(key = lambda x: x[1])
return y
def listtostr(y):
return ' '.join(map(str, y)
但是我不知道外部列表中会有多少个内部列表,并且想找到一个可以通过查找内部列表的第一个元素来检测ID的代码,为此ID创建一个新列表,然后在中查找第一个元素第二个内部列表(如果其ID与第一个内部列表的ID相同)(如果不是,则追加到第1组列表),然后创建一个新列表,依此类推。基本上,我想找到一种通过示例结构提供输出的方法。
答案 0 :(得分:1)
使用集合和列表的解决方案:
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
答案 1 :(得分:0)
您可以使组键到出现在其上的元素的字典中。 defaultdict
用于确保值始终是列表。
from collections import defaultdict
outer_list = sorted(outerlist, key=lambda seg: seg[0])
d = defaultdict(list)
for seg in outer_list:
d[seg[0]].append(d)
for group_idx, group in enumerate(d.values()):
print(f'Group {group_idx + 1}')
print('\n'.join(map(' '.join, group))))
如果您不想(或不能)导入defaultdict
,则可以执行以下操作
d = {}
for seg in outer_list:
d[seg[0]].setdefault([])
d[seg[0]].append(d)
答案 2 :(得分:0)
我们在这里
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
对于这种情况,我们不必构建任何额外的列表或复杂的打印结构。
答案 3 :(得分:0)
这似乎有点像一个家庭作业问题,所以我不会为您做所有的事情,但是我确实认为通过使用字典,您将可以找到大部分的学习方式
这解决了
的主要问题但是外部列表可以具有更多的内部列表作为元素,并且这些内部列表可以在第一个元素中具有不同的元素(而不是只有213、233、344可以是579或1000,因此在输出中必须有一个组4和组5部分)如果可以解决第一个问题,则可以使用这些功能,并且可以连续订购组并打印它们
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']]}
您可以对其进行排序
答案 4 :(得分:0)
您可以将它们存储在dict
中,如下所示:
def group_by_id(data):
grouped_data = {}
for element in data:
id = element[0]
elements_same_id = grouped_data.get(id, [])
elements_same_id.append(' '.join(element))
grouped_data[id] = elements_same_id
return grouped_data
for group_number, group in enumerate(group_by_id(outerlist), 1):
print(f'Group {group_number}')
for element in group:
print(element)
答案 5 :(得分:0)
您可以通过以下方式进行操作:
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"]]
def sortinlist(y):
y.sort(key = lambda x: x[0])
return y
groups = {}
for group in outerlist:
groups[group[0]] = groups.get(group[0], []) + [(group[1], group[2])]
for group in groups:
group = sortinlist(groups[group])
group_id = 1
for group in sorted(groups.keys()):
print("Group %d" % (group_id))
for member in groups[group]:
print("%d %d %s" % (group,member[0],member[1]))
答案 6 :(得分:0)
尝试将列表转换为字典,然后可以输出序列。
它根据列表中的第1,第2,第3元素对列表进行排序,并转换为字典并打印出来。
dt={}
count = 1
for i in sorted(outerlist,key=lambda x:(x[:])):
dt[i[0]]=dt.get(i[0],[])
dt[i[0]].append(i)
for i in dt.values():
print('Group ', count)
count += 1
for j in i:
print(' '.join(map(str,j)))
答案 7 :(得分:0)
我认为这是一个不好的选择,但是我想让它成为为每个项目创建一个新变量的一种方法,我建议为此目的使用字典,但是上面已经包含了很好的答案,在这种情况下,我只会我以这种方式发布信息,但请记住,最好使用字典
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"]]
count = 0
for l in outerlist:
try:
assert count != 0
for c in range(count):
if l[0] == locals()[f'new_list_{c}'][0][0]:
locals()[f'new_list_{c}'].append(l)
break
if count == c + 1:
raise UnboundLocalError
except:
locals()[f'new_list_{count}'] = [l]
count += 1
for c in range(count):
print(f'Group {c+1}')
for n in locals()[f'new_list_{c}']:
print(*n)
Group 1
344 0 str1
344 2 str4
344 3 str6
344 1 str7
Group 2
233 0 str2
Group 3
213 0 str3
213 1 str5
213 2 str8
您可以打印出变量
print(new_list_0)
print(new_list_1)
print(new_list_2)