2011-11-11 12 views
16

मेरे पास इस प्रारूप में टुपल्स की एक बड़ी सूची है। प्रत्येक ट्यूपल का दूसरा क्षेत्र श्रेणी क्षेत्र है।टुपल्स की एक सूची को उसी टुपल फ़ील्ड की उप-सूचियों में विभाजित करें

[(1, 'A', 'foo'), 
    (2, 'A', 'bar'), 
    (100, 'A', 'foo-bar'), 

    ('xx', 'B', 'foobar'), 
    ('yy', 'B', 'foo'), 

    (1000, 'C', 'py'), 
    (200, 'C', 'foo'), 
    ..] 

लिए सबसे कारगर तरीका इसे नीचे तोड़ने के लिए एक ही श्रेणी के उप-सूचियों में क्या है (ए, बी, सी।, आदि)?

+0

[संभावित उप-सूचियों को नए उप-सूचियों में छंटनी?] के संभावित डुप्लिकेट? (Http://stackoverflow.com/questions/71140 38/सॉर्टिंग-सब-सूचियों-इन-न्यू-सब-सूचियां) – agf

उत्तर

22

उपयोग itertools.groupby:

[list(group) for key,group in itertools.groupby(data,operator.itemgetter(1))] 

:

import itertools 
import operator 

data=[(1, 'A', 'foo'), 
    (2, 'A', 'bar'), 
    (100, 'A', 'foo-bar'), 

    ('xx', 'B', 'foobar'), 
    ('yy', 'B', 'foo'), 

    (1000, 'C', 'py'), 
    (200, 'C', 'foo'), 
    ] 

for key,group in itertools.groupby(data,operator.itemgetter(1)): 
    print(list(group)) 

पैदावार

[(1, 'A', 'foo'), (2, 'A', 'bar'), (100, 'A', 'foo-bar')] 
[('xx', 'B', 'foobar'), ('yy', 'B', 'foo')] 
[(1000, 'C', 'py'), (200, 'C', 'foo')] 

या, एक sublist के रूप में प्रत्येक समूह के साथ एक सूची बनाने के लिए, आप एक सूची समझ इस्तेमाल कर सकते हैं

सेको itertools.groupby पर nd तर्क एक फ़ंक्शन है जो itertools.groupbydata (पहला तर्क) में प्रत्येक आइटम पर लागू होता है। यह key वापस करने की उम्मीद है। itertools.groupby फिर उसी key के साथ सभी संगत वस्तुओं को एक साथ समूहित करता है।

operator.itemgetter(1) अनुक्रम में दूसरे आइटम को चुनता है।

उदाहरण के लिए

, अगर

row=(1, 'A', 'foo') 

तो

operator.itemgetter(1)(row) 

'A' बराबर होती है।


@eryksun टिप्पणी में बताते हैं के रूप में, यदि tuples की श्रेणियों कुछ यादृच्छिक क्रम में दिखाई देते हैं, तो आप data पहले itertools.groupby लागू करने से पहले सॉर्ट करना होगा। ऐसा इसलिए है क्योंकि itertools.groupy केवल संगत आइटम समूह में समान कुंजी के साथ एकत्र करता है।

श्रेणी के द्वारा tuples क्रमबद्ध करने के लिए, का उपयोग करें:

data2=sorted(data,key=operator.itemgetter(1)) 
+6

यह न भूलें कि पहले डेटा को सॉर्ट करना होगा: 'data2 = sorted (डेटा, key = operator.itemgetter (1))'। – eryksun

+1

एक बहुत ही निश्चित उत्तर के लिए धन्यवाद। –

+0

ग्रेट उत्तर, यह न भूलें कि आप ऑपरेटर के बजाए लैम्ब्डा का उपयोग कर सकते हैं, जो लोग लैम्बडास के लिए उपयोग किए जाते हैं। – jwg

1

tuples की सूची में से एकमात्र के एकाधिक सूचियों पाने के लिए:

foo = ((1,2), (3, 4), (5, 6), (7,8) , (9, 10)) 
[[z[i] for z in foo] for i in (0,1)] 

आप एकमात्र के कई tuples प्राप्त करने के लिए पसंद करते हैं:

zip(*[(1,4),(2,5),(3,6)]) 
संबंधित मुद्दे