Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimanakah anda cekap mengumpulkan data dalam Python berdasarkan kunci tertentu, dan apakah kaedah berbeza yang tersedia untuk tugas ini?

Bagaimanakah anda cekap mengumpulkan data dalam Python berdasarkan kunci tertentu, dan apakah kaedah berbeza yang tersedia untuk tugas ini?

Linda Hamilton
Lepaskan: 2024-10-27 00:29:02
asal
924 orang telah melayarinya

How do you efficiently group data in Python based on a specific key, and what are the different methods available for this task?

Kumpulan Python Oleh

Menggabungkan Data Mengikut Kunci

Dalam Python, mengumpulkan data mengikut kunci tertentu melibatkan penyusunan item berdasarkan atribut biasa. Ini boleh dicapai melalui pelbagai kaedah, menawarkan penyelesaian yang cekap untuk set data yang besar. Mari kita terokai cara mengumpulkan data dengan berkesan.

Teknik Pengumpulan Cekap dengan lalai

Pertimbangkan senario di mana kita mempunyai set pasangan data dan matlamatnya adalah untuk mengumpulkannya berdasarkan jenisnya. Untuk mencapai ini, kita boleh memanfaatkan kelas collections.defaultdict. Ia mencipta kamus di mana kunci yang hilang dimulakan secara automatik dengan nilai lalai, membolehkan kami menambahkan item pada kunci ini.

<code class="python">from collections import defaultdict

input = [
    ('11013331', 'KAT'),
    ('9085267', 'NOT'),
    ('5238761', 'ETH'),
    ('5349618', 'ETH'),
    ('11788544', 'NOT'),
    ('962142', 'ETH'),
    ('7795297', 'ETH'),
    ('7341464', 'ETH'),
    ('9843236', 'KAT'),
    ('5594916', 'ETH'),
    ('1550003', 'ETH'),
]

res = defaultdict(list)
for v, k in input:
    res[k].append(v)

print([{ 'type': k, 'items': v } for k, v in res.items()])</code>
Salin selepas log masuk

Output:

[{'items': ['9085267', '11788544'], 'type': 'NOT'}, {'items': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'], 'type': 'ETH'}, {'items': ['11013331', '9843236'], 'type': 'KAT'}]
Salin selepas log masuk

Menghimpun dengan itertools.groupby

Pendekatan lain melibatkan penggunaan itertools.groupby. Fungsi ini memerlukan input untuk diisih terlebih dahulu. Ia menjana kumpulan elemen berturut-turut di mana nilai kunci yang ditentukan adalah sama.

<code class="python">import itertools
from operator import itemgetter

sorted_input = sorted(input, key=itemgetter(1))
groups = itertools.groupby(sorted_input, key=itemgetter(1))

print([{ 'type': k, 'items': [x[0] for x in v]} for k, v in groups])</code>
Salin selepas log masuk

Output:

[{'items': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'], 'type': 'ETH'}, {'items': ['11013331', '9843236'], 'type': 'KAT'}, {'items': ['9085267', '11788544'], 'type': 'NOT'}]
Salin selepas log masuk

Mengekalkan Susunan Sisipan dalam Kamus

Sebelum Python 3.7, kamus tidak mengekalkan susunan sisipan. Untuk menangani perkara ini, collections.OrderedDict boleh digunakan untuk mengekalkan susunan pasangan nilai kunci.

<code class="python">from collections import OrderedDict

res = OrderedDict()
for v, k in input:
    if k in res:
        res[k].append(v)
    else:
        res[k] = [v]

print([{ 'type': k, 'items': v } for k, v in res.items()])</code>
Salin selepas log masuk

Walau bagaimanapun, dalam Python 3.7 dan lebih baharu, kamus biasa mengekalkan susunan sisipan, menjadikan OrderedDict tidak diperlukan.

Atas ialah kandungan terperinci Bagaimanakah anda cekap mengumpulkan data dalam Python berdasarkan kunci tertentu, dan apakah kaedah berbeza yang tersedia untuk tugas ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan