2015-05-12 13 views
10

पर आधारित एक फ्लैट सूची को अनदेखा करें मेरे पास अद्वितीय वस्तुओं की एक विस्तृत सूची है, जिनमें से कुछ दूसरों के साथ दी गई विशेषता साझा कर सकती हैं। मैं दिए गए गुण द्वारा समूहीकृत वस्तुओं के साथ, नेस्टेड सूची-सूची सूचीबद्ध करना चाहता हूं।मनमानी मानदंड

>>> flat = ["Shoes", "pants", "shirt", "tie", "jacket", "hat"] 

मैं लंबाई से यह समूह के लिए चाहते हो सकता है, जैसे::

>>> nest_by_length(flat) 
[['tie', 'hat'], ['shoes', 'pants', 'shirt'], ['jacket']] 

मैं similarquestions और suggestions के एक जोड़े को देखा है एक न्यूनतम उदाहरण के रूप में निम्नलिखित सूची दी। हालांकि, इन सभी मामलों में, घोंसला इनपुट सूची के क्रम पर आधारित है। मेरे मामले में, इनपुट सूची का ऑर्डरिंग पूरी तरह से अप्रत्याशित है, जैसा आउटपुट के लिए उप-सूचियों की संख्या और उप-सूची में आइटम की संख्या है।

क्या यह करने के लिए कोई मानक कार्य या मूर्ख तरीका है? या, अधिक ने संक्षेप में

from itertools import groupby 

flat = ["Shoes", "pants", "shirt", "tie", "jacket", "hat"] 

result=[] 
for k, g in groupby(sorted(flat, key=len), key=len): 
    result.append(list(g)) 

print result 

:

उत्तर

10

किसी मौजूदा सूची के लिए एक आम मुहावरा itertools में groupby उपयोग करने के लिए है

[list(g) for _,g in groupby(sorted(flat, key=len), key=len)] 

प्रिंटों:

[['tie', 'hat'], ['Shoes', 'pants', 'shirt'], ['jacket']] 

इनपुट groupby है करने के लिए कुंजी समारोह के आउटपुट के बदलते मूल्य के आधार पर समूहों में समूहित किया गया यह मामला len। आम तौर पर, आपको उसी कुंजी फ़ंक्शन के आधार पर सूची को प्रीऑर्डर करना होगा, इसलिए sorted फ़ंक्शन को पहले कॉल किया जाता है।

अपने स्रोत सूची अभी तक पूरा नहीं किया गया है, या नहीं मानदंडों के आधार पर क्रमित करने योग्य (या तुम सिर्फ एक और विकल्प पसंद करेंगे), एक dict कि एक अद्वितीय कुंजी मूल्य के लिए अपने मापदंड के नक्शे बनाने के लिए:

groups={} 
for e in flat: 
    groups.setdefault(len(e), []).append(e) 

print groups  
# {5: ['Shoes', 'pants', 'shirt'], 3: ['tie', 'hat'], 6: ['jacket']} 

आप यह भी नहीं बल्कि SetDefault से defaultdict उपयोग कर सकते हैं मनमाने ढंग से कुंजी मान के साथ:

:

from collections import defaultdict 
groups=defaultdict(list) 
for e in flat: 
    groups[len(e)].append(e) 
# groups=defaultdict(<type 'list'>, {5: ['Shoes', 'pants', 'shirt'], 3: ['tie', 'hat'], 6: ['jacket']}) 

या तो मामले में, तो आप उस से नेस्टेड सूची बना सकते हैं

+0

मैं आपकी पूर्णता की सराहना करता हूं। मुझे संदेह था कि ग्रुपबी जैसे कुछ फ़ंक्शन होंगे जिन्हें मैं नहीं जानता था, लेकिन शब्दकोश चाल सिर्फ चालाक है। धन्यवाद! – Joe

संबंधित मुद्दे