Hướng dẫn how do i groupby a list in python? - làm cách nào để nhóm theo 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 i groupby a list in python? - làm cách nào để nhóm theo 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 i groupby a list in python? - làm cách nào để nhóm theo 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

37.9k8 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.7K24 Huy hiệu vàng143 Huy hiệu bạc216 Huy hiệu đồng24 gold badges143 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 i groupby a list in python? - làm cách nào để nhóm theo 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.25614 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

8872 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 các mục tương tự với một danh sách trong Python?

Phương thức Groupby sẽ nhóm tất cả các chuỗi tương tự thành một đối tượng ITER ...
Khởi tạo danh sách các chuỗi ..
Nhập mô -đun Itertools ..
Khởi tạo một danh sách trống ..
Bây giờ, chuyển các chuỗi và chức năng Lambda cho itertools. ....
Hàm Lambda sẽ trả về phần đầu tiên của chuỗi sau khi chia nó bằng -.

Python itertools Group () làm gì?

GroupBy () Phương pháp này tính toán các khóa cho từng phần tử có thể có. Nó trả về chìa khóa và có thể lặp lại của các mục được nhóm.calculates the keys for each element present in iterable. It returns key and iterable of grouped items.

Làm thế nào để bạn đếm các yếu tố trong một danh sách trong Python?

Cách đơn giản nhất để có được số lượng các phần tử trong danh sách là sử dụng chức năng tích hợp Python Len ().Như hàm tên cho thấy, Len () trả về độ dài của danh sách, bất kể các loại phần tử trong đó.use the Python built-in function len() . As the name function suggests, len() returns the length of the list, regardless of the types of elements in it.

Những gì có thể sử dụng phương thức g phải của groupBy ()?

Chức năng Groupby là gì?Nhóm của Pandas là một chức năng mạnh mẽ và linh hoạt trong Python.Nó cho phép bạn chia dữ liệu của mình thành các nhóm riêng biệt để thực hiện tính toán để phân tích tốt hơn.split your data into separate groups to perform computations for better analysis.