Python में collections.Counter का उपयोग करके सूची के तत्वों को उनकी आवृत्ति के अनुसार समूहबद्ध करना, जिससे समान तत्व एक साथ आ जाएं।
समस्या
सूची: [21, 83, 44, 52, 61, 72, 81, 96, 18, 44]
परिणाम: [21, 83, 44, 44, 52, 61, 72, 81, 96, 18] (44 लगातार आ गए)
उदाहरण
from collections import Counter
my_list = [21, 83, 44, 52, 61, 72, 81, 96, 18, 44]
print("मूल सूची:", my_list)
# Counter से आवृत्ति गिनें
freq = Counter(my_list)
print("आवृत्ति:", freq) # Counter({44: 2, 21: 1, 83: 1, 52: 1, 61: 1, 72: 1, 81: 1, 96: 1, 18: 1})
# पुनर्क्रमित: प्रत्येक मान को उसकी गिनती के अनुसार दोहराएं
my_result = []
for value, count in freq.items():
my_result.extend([value] * count)
print("पुनर्क्रमित सूची:", my_result)
आउटपुट
मूल सूची: [21, 83, 44, 52, 61, 72, 81, 96, 18, 44]
आवृत्ति: Counter({44: 2, 21: 1, 83: 1, 52: 1, 61: 1, 72: 1, 81: 1, 96: 1, 18: 1})
पुनर्क्रमित सूची: [21, 83, 44, 44, 52, 61, 72, 81, 96, 18]
महत्वपूर्ण नोट: क्रम अनिश्चित है
Counter.items() का क्रम सम्मिलन क्रम (Python 3.7+) या मनमाना हो सकता है। परिणाम में तत्वों का क्रम हर बार अलग हो सकता है।
क्रम बनाए रखने के संस्करण
1. मूल सूची में पहली उपस्थिति के क्रम में
def reorder_consecutive_preserve_order(lst):
"""पहली उपस्थिति के क्रम में समान तत्वों को समूहबद्ध करें"""
from collections import OrderedDict
# OrderedDict से क्रम बनाए रखते हुए गिनें
freq = OrderedDict()
for item in lst:
freq[item] = freq.get(item, 0) + 1
result = []
for value, count in freq.items():
result.extend([value] * count)
return result
print("क्रम संरक्षित:", reorder_consecutive_preserve_order(my_list))
# [21, 83, 44, 44, 52, 61, 72, 81, 96, 18] - 44 पहली बार इंडेक्स 2 पर आया
2. आवृत्ति के अवरोही क्रम में (सबसे आम पहले)
def reorder_by_frequency(lst):
"""आवृत्ति के अनुसार क्रमबद्ध (सबसे आम पहले)"""
freq = Counter(lst)
# most_common() आवृत्ति के अवरोही क्रम में लौटाता है
result = []
for value, count in freq.most_common():
result.extend([value] * count)
return result
print("आवृत्ति क्रम:", reorder_by_frequency(my_list))
# [44, 44, 21, 83, 52, 61, 72, 81, 96, 18] - 44 सबसे आम है
3. मान के अनुसार क्रमबद्ध
def reorder_sorted(lst):
"""मान के अनुसार क्रमबद्ध करके समूहबद्ध"""
freq = Counter(lst)
result = []
for value in sorted(freq.keys()):
result.extend([value] * freq[value])
return result
print("मान क्रम:", reorder_sorted(my_list))
# [18, 21, 44, 44, 52, 61, 72, 81, 83, 96]
List Comprehension संस्करण
# एक लाइनर (क्रम अनिश्चित)
result = [val for val, cnt in Counter(my_list).items() for _ in range(cnt)]
# क्रम संरक्षित एक लाइनर (Python 3.7+ dict क्रम बनाए रखता है)
seen = set()
result_ordered = [
val for val in my_list
if not (val in seen or seen.add(val))
for _ in range(my_list.count(val))
]
# नोट: count() हर बार O(n) है, कुल O(n²) - बड़ी सूचियों के लिए धीमा
कुशल क्रम-संरक्षित संस्करण
def reorder_consecutive_efficient(lst):
"""O(n) समय, क्रम संरक्षित"""
from collections import Counter
freq = Counter(lst)
seen = set()
result = []
for val in lst:
if val not in seen:
seen.add(val)
result.extend([val] * freq[val])
return result
print("कुशल क्रम-संरक्षित:", reorder_consecutive_efficient(my_list))
Pandas में उपयोग
import pandas as pd
s = pd.Series([21, 83, 44, 52, 61, 72, 81, 96, 18, 44])
# value_counts() आवृत्ति के अवरोही क्रम में देता है
freq = s.value_counts()
print("आवृत्ति:\n", freq)
# पुनर्क्रमित
result = []
for val, cnt in freq.items():
result.extend([val] * cnt)
print("पुनर्क्रमित:", result)
उपयोग के मामले
- डेटा संपीड़न / रन-लेंथ एन्कोडिंग तैयारी
- कैश लोकैलिटी सुधारना (समान मान एक साथ)
- सॉर्टिंग एल्गोरिदम में ऑप्टिमाइज़ेशन
- दृश्यकरण के लिए डेटा समूहबद्ध करना