2012-04-12 11 views
12

में सूची की सूची में एक फ्लैट सूची को परिवर्तित करें आम तौर पर, आप like here के आसपास दूसरी तरफ जाना चाहते हैं। मैं सोच रहा था कि कैसे आप अजगरपाइथन

में देगी सरणी quasy सूची की एक सूची के लिए एक फ्लैट सूची में बदल सकते हैं, numpy में आप की तरह कुछ कर सकता है:

>>> a=numpy.aranage(9) 
>>> a.reshape(3,3) 
>>> a 
array([[0, 1, 2], 
    [3, 4, 5], 
    [6, 7, 8]]) 

मैं सोच रहा था कि कैसे आप विपरीत करते हैं, और

>>> Mylist 
['a', 'b', 'c', 'd', 'e', 'f'] 
>>> newList = [] 
for i in range(0,len(Mylist),2): 
...  newList.append(Mylist[i], Mylist[i+1]) 
>>> newList 
[['a', 'b'], ['c', 'd'], ['e', 'f']] 

वहाँ एक और अधिक "pythonic" जिस तरह से यह करने के लिए है: मेरी हमेशा की तरह समाधान कुछ की तरह है?

+0

यह सबसे अच्छा है कि 'सूची' को परिवर्तनीय नाम के रूप में उपयोग न करें क्योंकि बिल्टिन फ़ंक्शन' सूची() ' – jamylak

+0

हाँ आप सही हैं, मैं बस कोड को तेज़ी से संपादित कर रहा था, मेरा मूल कोड ऐसा नहीं दिखता है। – Oz123

उत्तर

27
>>> l = ['a', 'b', 'c', 'd', 'e', 'f'] 
>>> zip(*[iter(l)]*2) 
[('a', 'b'), ('c', 'd'), ('e', 'f')] 

के रूप में यह @Lattyware द्वारा बताया गया है, यह केवल काम करता है अगर वहाँ zip समारोह जो हर बार किसी टपल रिटर्न के लिए प्रत्येक तर्क में पर्याप्त आइटम हैं। यदि पैरामीटर में से किसी के पास दूसरों की तुलना में कम आइटम हैं, तो वस्तुओं को काट दिया जाता है।

>>> l = ['a', 'b', 'c', 'd', 'e', 'f','g'] 
>>> zip(*[iter(l)]*2) 
[('a', 'b'), ('c', 'd'), ('e', 'f')] 

इस तो मामला है, तो यह

How does zip(*[iter(s)]*n) work

+3

यह समाधान केवल तभी काम करता है जब इसे भरने के लिए पर्याप्त वस्तुएं हों, अन्यथा आइटम काट दिया जाए। –

+0

जनरेटर बनाना फिर इसके संदर्भ को डुप्लिकेट करना; चतुर। –

+1

@NickT अच्छी तरह से तकनीकी रूप से यह एक संकेतक नहीं है जो जनरेटर नहीं है और मैं चतुरता के लिए क्रेडिट नहीं ले सकता :) – jamylak

11

यह आमतौर पर itertools documentation से समूहक नुस्खा का उपयोग किया जाता @Sven Marnach से समाधान का उपयोग करने के लिए सबसे अच्छा है:

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return itertools.izip_longest(fillvalue=fillvalue, *args) 

उदाहरण:

>>> my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> list(grouper(2, my_list)) 
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', None)] 
0

एक के बजाय एक फ्लैट सूची से tuples की एक सूची सूचियों की एक सूची, पसंद करते हैं, तो एक ऐसा कर सकता है:

a = range(20) # sample starting list 
    b = [] # new list 
    c = [] # alternate new list 
    # ny is length of new list. nx length of each list within it 
    nx = 5; ny = 4 
    bb = 0; ee = bb + nx # option one: sliding indeces for slices. 
    for ii in range(ny-1): 
     bb += nx 
     ee += nx 
     b.append(a[bb:ee]) 
     c.append(a[slice(ii*nx,nx*(ii+1))]) # option two, use slice() 

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

+0

मुझे समझ में नहीं आता कि आप स्लाइस सिंटैक्स की बजाय दूसरे दृष्टिकोण में 'स्लाइस() 'का उपयोग क्यों कर रहे हैं। गणना करने का मतलब यह नहीं है कि आप 'a [ii * nx: nx * (ii + 1)] 'या जो कुछ भी उपयोग नहीं कर सकते हैं। – Blckknght

5

सूचियों की एक सूची बनाने के लिए एक और तरीका है सरल किया जा सकता:

>>>MyList = ['a','b','c','d','e','f'] 
# Calculate desired row/col 
>>>row = 3 
>>>col = 2 
>>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)] 
>>>NewList 
[['a', 'b', 'c'], ['d', 'e', 'f']] 

इस विधि किसी भी पंक्ति और स्तंभ आकार का उत्पादन करने के लिए बढ़ाया जा सकता कर सकते हैं। आप पंक्ति और स्तंभ मान ऐसी है कि row*col >len(MyList) चयन करते हैं, sublist (पंक्ति) MyList में अंतिम मान युक्त वहाँ खत्म हो जाएगा, और NewList बस खाली सूचियों की उपयुक्त संख्या से भर दिया जाएगा पंक्तियां/स्तंभ विनिर्देशों को पूरा करने के

>>>MyList = ['a','b','c','d','e','f','g','h'] 
>>>row = 3 
>>>col = 3 
>>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)] 
>>>NewList 
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g','h']] 

>>>row = 4 
>>>col = 4 
>>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)] 
[['a', 'b', 'c', 'd'], ['e', 'f', 'g','h'], [], []] 
+1

मुझे लगता है कि स्वीकार्य उत्तर होना चाहिए क्योंकि सवाल सूचियों की सूची के लिए पूछ रहा था, न कि tuples की एक सूची। या ऊपर टिप्पणी में रॉबर्ट द्वारा जवाब। –