2011-04-19 19 views
11

मैं प्रयोगशाला के लिए प्रोग्राम करने के लिए पायथन का उपयोग कर रहा हूं। मैं किसी दिए गए स्ट्रिंग में प्रत्येक 3 वर्णों को कैसे टुकड़ा कर सकता हूं और इसे किसी सूची में जोड़ सकता हूं?मैं प्रत्येक 3 सूचकांक को एक स्ट्रिंग कैसे स्लाइस करूं?

यानी XXXxxxXXXxxxXXXxxxXXXxxxXXX

string = 'XXXxxxXXXxxxXXXxxxXXXxxxXXX' 
mylist = [] 

for x in string: 
    string[?:?:?] 
    mylist.append(string) 

मैं इस तरह देखने के लिए सूची चाहते हैं (जहां X या एक्स किसी भी पत्र है): [ 'XXX', 'xxx', 'XXX', 'xxx', ' XXX '.... आदि]

कोई भी विचार?

+2

एएच, कोडन =)) – ninjagecko

+3

यह बहुत ही समान है [भाग में सूची में पुनरावृत्त] [http://stackoverflow.com/questions/434287/what-is-the-most-pythonic-way-to -इटरेट-ओवर-ए-लिस्ट-इन-चंक्स) - कुछ उत्कृष्ट दृष्टिकोणों के लिए उत्तर देखें। –

उत्तर

19

संक्षेप में, आप नहीं कर सकते।

अब, आप अपने खुद के समारोह लिखने के लिए संभवतः की आवश्यकता होगी:

def split(str, num): 
    return [ str[start:start+num] for start in range(0, len(str), num) ] 

उदाहरण के लिए:

 
>>> split("xxxXXX", 3) 
['xxx', 'XXX'] 
>>> split("xxxXXXxx", 3) 
['xxx', 'XXX', 'xx'] 
4

जहाँ तक मुझे कोई विधि में बनाया गया है वहाँ है कि आप की अनुमति देता है पता है प्रत्येक एक्स सूचकांक str एक स्ट्रंक करने के लिए। हालांकि इस करना चाहिए काम करता है:

str = "stringStringStringString" 

def chunk_str(str, chunk_size): 
    return [str[i:i+chunk_size] for i in range(0, len(str), chunk_size)] 

chunk_str(str,3) 

पैदा करता है:

['str', 'ing', 'Str', 'ing', 'Str', 'ing', 'Str', 'ing'] 
+0

यहां तक ​​कि .split() विधि भी नहीं है? – Francis

+0

नहीं - '.split' विधि केवल वर्णों के आधार पर विभाजन के लिए है। –

+0

यह अब तक का सबसे अच्छा समाधान है। अच्छा काम! –

7

एक 3 के टुकड़ों में 3 का हिस्सा और तार में विभाजित सूचियों के बीच अंतर यह है कि फिर से मॉड्यूल सूचियों के बजाय तार के साथ काम करता है।

तो प्रदर्शन के लिए महत्वपूर्ण है (यानी आप तार के हजारों विभाजित कर रहे हैं), तो आपको इसकी जांच करनी चाहिए कि किस प्रकार भिन्न जवाब आपके आवेदन

>>> import re 
>>> re.findall('...','XXXxxxXXXxxxXXXxxxXXXxxxXXX') 
['XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX'] 

>>> chunksize=3 
>>> re.findall('.{%s}'%chunksize,'XXXxxxXXXxxxXXXxxxXXXxxxXXX') 
['XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX'] 

यह काम करता है क्योंकि . का मतलब नियमित अभिव्यक्ति में "किसी भी चरित्र से मेल" में की तुलना करें।
.{3} का अर्थ है "किसी भी 3 अक्षरों से मेल खाते हैं", और इतने पर

1

नवंबर 2008 के बाद से How do you split a list into evenly sized chunks in Python? से एक जवाब को कॉपी करना:

अजगर प्रलेखन से

सीधे (itertools के लिए व्यंजनों):

from itertools import izip, chain, repeat 

def grouper(n, iterable, padvalue=None): 
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')" 
    return izip(*[chain(iterable, repeat(padvalue, n-1))]*n) 

एक वैकल्पिक रूप से ले लें, जैसा कि जेएफएसबीस्टियन द्वारा सुझाया गया है:

from itertools import izip_longest 

def grouper(n, iterable, padvalue=None): 
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')" 
    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue) 

मुझे लगता है कि गिडो की टीआई मुझे मशीन काम करता है-काम-काम करेगा-काम करेगा-फिर से काम कर रहा था।

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