2015-04-07 8 views
5

क्या 'splat' ऑपरेटर (उदा। a, *rest = somelist) का उपयोग करने का कोई तरीका है इस तरह से कि यह एक निश्चित संख्या में आइटम लेता है?पायथन में दिए गए किसी भी आइटम को अनपैक करें?

केस का उपयोग करें: मैं कुछ इनपुट को विभाजित करना चाहता हूं जो मुझे एक संख्या में मिल रहा है, सूचियों की एक सूची, एक और संख्या, और सूचियों की एक और सूची।

मेरे इनपुट इस तरह दिखता है:

5 
1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 
5 
1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 

और मुझे इन नामों first_num, first_arrangement, second_num, second_arrangement ऐसी है कि चाहते हैं:

first_num == 5 
first_arrangement == [[1, 2, 3, 4], [5, 6, 7, 8], ...] 

और इतने पर।

ऐसा करने के लिए, यह संभव है कि मैं लाइनों को प्राप्त करने के लिए पुनरावृत्त से वस्तुओं की एक निश्चित संख्या का उपभोग कर सकूं। ऐसा कुछ मध्यवर्ती चरण के रूप में आदर्श होगा: first_num, *[4]first_arrangement, second_num, *[4]second_arrangement = lines

इसे हल करने का सामान्य/कैननिकल/पायथनिक तरीका क्या है?

+0

पाइथन का कौन सा संस्करण आप उपयोग कर रहे हैं? – thefourtheye

+5

क्या आप बस अपने तर्कों को टुकड़ा नहीं कर सकते हैं => 'first_arrangement = args [1: 5]' ...? –

+0

पहले प्रश्न के उत्तर में, '*' – MJeffryes

उत्तर

2

मैं यह करने के जनरेटर है कि आप से अधिक पुनरावृत्ति कर रहे हैं पर जिम्मेदारी डाल करने के लिए किया जाएगा विहित, pythonic तरीका लगता है। मैं बहुत की तरह एक जनरेटर समारोह निर्धारित करेंगे:

data = [ 
    5, 
    [1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 10, 11, 12], 
    [13, 14, 15, 16], 
    5, 
    [1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 10, 11, 12], 
    [13, 14, 15, 16] 
] 

तो लेखन:

first_num, first_arr, second_num, second_arr = generate_arrangements(data) 

आप अपने वांछित उत्पादन देता

import itertools 

def generate_arrangements(iterable, size=4): 
    iterator = iter(iterable) 
    while True: 
     yield next(iterator) 
     yield list(list(row) for row in itertools.islice(iterator, size)) 

तुम इतनी तरह एक सूची में अपने डेटा है कहो :

>>> first_num 
5 
>>> first_arr 
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] 

आप भी यी फ़ील्ड संख्या और एक ही समय में व्यवस्था है, और उपयोगकर्ता के लिए कुछ अतिरिक्त unpacking, जो एक और अधिक प्राकृतिक दृष्टिकोण हो सकता है करते हैं:

import itertools 

def generate_arrangements(iterable): 
    iterator = iter(iterable) 
    while True: 
     number = next(iterator) 
     arrangement = list(list(row) for row in itertools.islice(iterator, 4)) 
     yield number, arrangement 

(first_num, first_arr), (second_num, second_arr) = generate_arrangements(data) 

@JoranBeasley टिप्पणी में लिखते हैं, इस फार्म आसान टपल उपयोग करने के लिए बनाता है फॉर-लूप में अनपॅकिंग, इस तरह:

for num,arr in generate_arrangements(data): 
    print(num) 
    print(arr) 
+0

बहुत अच्छा जवाब ... मैं अंक के लिए 'जोड़ता हूं, जेनरेट_रंगमेंट्स (डेटा) में एआर' –

+0

@ जोरन बेस्ले धन्यवाद! अच्छा सुझाव, मैंने इसे अपने जवाब के अंत तक निपटाया है। – jme

1

यह स्पष्ट नहीं है कि आप डेटा को किस प्रारूप में प्राप्त कर रहे हैं। क्या ये तार, फ़ाइल में डेटा इत्यादि हैं। मान लें data आपके नमूना इनपुट का एक स्ट्रिंगियो ऑब्जेक्ट है। आप n आइटम को निकालने के लिए, उदा पुनरावर्तक पर itertools.islice उपयोग कर सकते हैं:

>>> from itertools import islice 
>>> d = iter(data) 
>>> first_num = int(next(d)) 
>>> first_arrangement = [[int(x) for x in l.split()] for l in islice(d, 4)] 
>>> print(first_num, first_arrangement) 
5 [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] 
संबंधित मुद्दे