Hướng dẫn how do you group values in a list in python? - làm thế nào để bạn nhóm các giá trị trong một danh sách trong python?

Giả sử tôi có một danh sách như thế này:

mylist = [["A",0], ["B",1], ["C",0], ["D",2], ["E",2]]

Làm thế nào tôi có thể nhóm thanh lịch nhất này để có được đầu ra danh sách này trong Python:

[["A", "C"], ["B"], ["D", "E"]]

Vì vậy, các giá trị được nhóm lại bởi giá trị secound nhưng thứ tự được bảo tồn ...

Hướng dẫn how do you group values in a list in python? - làm thế nào để bạn nhóm các giá trị trong một danh sách trong python?

Hỏi ngày 17 tháng 4 năm 2011 lúc 17:42Apr 17, 2011 at 17:42

2

values = set(map(lambda x:x[1], mylist))
newlist = [[y[0] for y in mylist if y[1]==x] for x in values]

Hướng dẫn how do you group values in a list in python? - làm thế nào để bạn nhóm các giá trị trong một danh sách trong python?

Đã trả lời ngày 17 tháng 4 năm 2011 lúc 17:51Apr 17, 2011 at 17:51

HowardHowardHoward

38K8 Huy hiệu vàng61 Huy hiệu bạc82 Huy hiệu Đồng8 gold badges61 silver badges82 bronze badges

8

from operator import itemgetter
from itertools import groupby

lki = [["A",0], ["B",1], ["C",0], ["D",2], ["E",2]]
lki.sort(key=itemgetter(1))

glo = [[x for x,y in g]
       for k,g in  groupby(lki,key=itemgetter(1))]

print glo

.

CHỈNH SỬA

Một giải pháp khác không cần nhập khẩu, dễ đọc hơn, giữ các đơn đặt hàng và ngắn hơn 22 % so với trước đó:

oldlist = [["A",0], ["B",1], ["C",0], ["D",2], ["E",2]]

newlist, dicpos = [],{}
for val,k in oldlist:
    if k in dicpos:
        newlist[dicpos[k]].extend(val)
    else:
        newlist.append([val])
        dicpos[k] = len(dicpos)

print newlist

Đã trả lời ngày 17 tháng 4 năm 2011 lúc 18:02Apr 17, 2011 at 18:02

Eyquemeyquemeyquem

26.1k7 Huy hiệu vàng36 Huy hiệu bạc45 Huy hiệu Đồng7 gold badges36 silver badges45 bronze badges

2

Câu trả lời của Howard là súc tích và thanh lịch, nhưng đó cũng là O (n^2) trong trường hợp xấu nhất. Đối với các danh sách lớn với số lượng lớn các giá trị khóa nhóm, bạn sẽ muốn sắp xếp danh sách trước và sau đó sử dụng

[["A", "C"], ["B"], ["D", "E"]]
3:

>>> from itertools import groupby
>>> from operator import itemgetter
>>> seq = [["A",0], ["B",1], ["C",0], ["D",2], ["E",2]]
>>> seq.sort(key = itemgetter(1))
>>> groups = groupby(seq, itemgetter(1))
>>> [[item[0] for item in data] for (key, data) in groups]
[['A', 'C'], ['B'], ['D', 'E']]

Edit:

Tôi đã thay đổi điều này sau khi thấy câu trả lời của Eyequem:

[["A", "C"], ["B"], ["D", "E"]]
4 đẹp hơn
[["A", "C"], ["B"], ["D", "E"]]
5.

Đã trả lời ngày 17 tháng 4 năm 2011 lúc 18:03Apr 17, 2011 at 18:03

Robert Rossneyrobert RossneyRobert Rossney

92,8K24 Huy hiệu vàng144 Huy hiệu bạc216 Huy hiệu đồng24 gold badges144 silver badges216 bronze badges

5

>>> import collections
>>> D1 = collections.defaultdict(list)
>>> for element in L1:
...     D1[element[1]].append(element[0])
... 
>>> L2 = D1.values()
>>> print L2
[['A', 'C'], ['B'], ['D', 'E']]
>>> 

Đã trả lời ngày 18 tháng 4 năm 2011 lúc 0:28Apr 18, 2011 at 0:28

Hướng dẫn how do you group values in a list in python? - làm thế nào để bạn nhóm các giá trị trong một danh sách trong python?

Đóng biếndting

37.8K10 Huy hiệu vàng92 Huy hiệu bạc114 Huy hiệu đồng10 gold badges92 silver badges114 bronze badges

Tôi không biết về Elegant, nhưng nó chắc chắn có thể thực hiện được:

oldlist = [["A",0], ["B",1], ["C",0], ["D",2], ["E",2]]
# change into: list = [["A", "C"], ["B"], ["D", "E"]]

order=[]
dic=dict()
for value,key in oldlist:
  try:
    dic[key].append(value)
  except KeyError:
    order.append(key)
    dic[key]=[value]
newlist=map(dic.get, order)

print newlist

Điều này bảo tồn thứ tự của sự xuất hiện đầu tiên của từng khóa, cũng như thứ tự của các mục cho mỗi khóa. Nó đòi hỏi chìa khóa phải có thể băm, nhưng không gán ý nghĩa cho nó.

len = max(key for (item, key) in list)
newlist = [[] for i in range(len+1)]
for item,key in list:
  newlist[key].append(item)

Bạn có thể làm điều đó trong một danh sách hiểu một danh sách, có lẽ thanh lịch hơn nhưng O (N ** 2):

[[item for (item,key) in list if key==i] for i in range(max(key for (item,key) in list)+1)]

Đã trả lời ngày 17 tháng 4 năm 2011 lúc 17:47Apr 17, 2011 at 17:47

Sverresverresverre

6.6382 Huy hiệu vàng26 Huy hiệu bạc35 Huy hiệu Đồng2 gold badges26 silver badges35 bronze badges

[["A", "C"], ["B"], ["D", "E"]]
0

Về cơ bản, nếu danh sách được sắp xếp, có thể

[["A", "C"], ["B"], ["D", "E"]]
6 bằng cách xem nhóm cuối cùng được xây dựng theo các bước trước - bạn có thể biết nếu bạn cần bắt đầu một nhóm mới hoặc sửa đổi một nhóm hiện có.
[["A", "C"], ["B"], ["D", "E"]]
7 bit là một mẹo cho phép chúng tôi sử dụng
[["A", "C"], ["B"], ["D", "E"]]
8 trong Python. .

Đã trả lời ngày 7 tháng 5 năm 2020 lúc 11:37May 7, 2020 at 11:37

SASSA NFSASSA NFSassa NF

5.27614 Huy hiệu bạc22 Huy hiệu đồng14 silver badges22 bronze badges

Nếu sử dụng thư viện Convtools, cung cấp nhiều nguyên thủy xử lý dữ liệu và tạo mã ad hoc dưới mui xe, thì:

[["A", "C"], ["B"], ["D", "E"]]
1

Đã trả lời ngày 12 tháng 11 năm 2021 lúc 12:49Nov 12, 2021 at 12:49

Westandskifwestandskifwestandskif

8896 Huy hiệu bạc9 Huy hiệu Đồng6 silver badges9 bronze badges

Một câu trả lời lấy cảm hứng từ câu trả lời của @Howard.

[["A", "C"], ["B"], ["D", "E"]]
2

Đã trả lời ngày 15 tháng 7 lúc 16:46Jul 15 at 16:46

MattstmattstMattSt

9072 Huy hiệu vàng14 Huy hiệu bạc32 Huy hiệu Đồng2 gold badges14 silver badges32 bronze badges

Làm thế nào để bạn nhóm dữ liệu trong một danh sách?

Để nhóm dữ liệu trong danh sách trong Excel: Chọn các hàng hoặc cột bạn muốn nhóm.Trên tab Dữ liệu, trong nhóm phác thảo, nhấp vào lệnh nhóm.On the Data tab, in the Outline group, click the Group command.

Làm thế nào để bạn nhóm các giá trị tương tự trong một danh sách trong Python?

Phương pháp số 1: Sử dụng lambda + itertools.group () + split () Sự kết hợp của ba hàm trên giúp chúng tôi đạt được nhiệm vụ.Phương pháp phân chia là khóa vì nó định nghĩa phân tách theo nhóm phải được thực hiện.Hàm nhóm thực hiện nhóm các yếu tố.Using lambda + itertools.groupby() + split() The combination of above three functions help us achieve the task. The split method is key as it defines the separator by which grouping has to be performed. The groupby function does the grouping of elements.

Là danh sách () và [] giống nhau trong Python?

Về mặt thực tế không có sự khác biệt.Tôi hy vọng [] sẽ nhanh hơn, bởi vì nó không liên quan đến việc tra cứu toàn cầu theo sau là một cuộc gọi chức năng.Ngoài ra, nó cũng vậy.there's no difference. I'd expect [] to be faster, because it does not involve a global lookup followed by a function call. Other than that, it's the same.

Danh sách [] có nghĩa là gì trong Python?

Một danh sách là một container Python được đặt hàng và có thể thay đổi, là một trong những cấu trúc dữ liệu phổ biến nhất trong Python.Để tạo một danh sách, các phần tử được đặt bên trong dấu ngoặc vuông ([]), được phân tách bằng dấu phẩy.an ordered and mutable Python container, being one of the most common data structures in Python. To create a list, the elements are placed inside square brackets ([]), separated by commas.