2011-04-18 14 views
5

में मेरे पास "2,5,7-9,12" स्ट्रिंग है।इंटरफेर के साथ पूर्णांक सेट की पार्स स्ट्रिंग

मैं इसे [2, 5, 7, 8, 9, 12] सूची प्राप्त करना चाहता हूं।

क्या इसमें पाइथन में कोई अंतर्निहित कार्य है?

धन्यवाद।

यूपीडी। मुझे लगता है, सीधा जवाब नहीं है। वैसे भी, आपके "स्निपेट्स" के लिए धन्यवाद। द्वारा सुझाए गए एक का उपयोग, स्वेन मार्नैच

+0

कोई डुप्लिकेट। http://stackoverflow.com/questions/712460/interpreting-number-ranges-in-python –

उत्तर

1

This version मनमाने ढंग से खाली स्थान के हैंडल, पर्वतमाला ओवरलैपिंग, बाहर के आदेश पर्वतमाला, और नकारात्मक पूर्णांक:

from itertools import chain 

def group_to_range(group): 
    group = ''.join(group.split()) 
    sign, g = ('-', group[1:]) if group.startswith('-') else ('', group) 
    r = g.split('-', 1) 
    r[0] = sign + r[0] 
    r = sorted(int(__) for __ in r) 
    return range(r[0], 1 + r[-1]) 

def rangeexpand(txt): 
    ranges = chain.from_iterable(group_to_range(__) for __ in txt.split(',')) 
    return sorted(set(ranges)) 


>>> rangeexpand('-6,-3--1,3-5,7-11,14,15,17-20') 
[-6, -3, -2, -1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20] 
>>> rangeexpand('1-4,6,3-2, 11, 8 - 12,5,14-14') 
[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14] 
1

ऐसा नहीं है कि मैं के बारे में पता कर रहा हूँ, लेकिन आप आसानी से अपने खुद बना सकते हैं:

  1. एक परिणाम सूची बनाएं।
  2. , द्वारा स्ट्रिंग स्ट्रिंग्स और परिणाम पर पुनरावृत्ति शुरू करें।
    1. यदि वर्तमान स्ट्रिंग में - सूची में कोई श्रेणी शामिल है।
    2. यदि वर्तमान स्ट्रिंग एक संख्या है, तो इसे सूची में जोड़ें।
    3. अन्यथा एक त्रुटि लौटाएं।
  3. सूची लौटें।
+0

किसी को भी उन सभी सही उत्तरों को कम करने के लिए एक बुरे मूड में होना चाहिए। मैं उन्हें वापस शून्य पर लाऊंगा :) –

5
s = "2,5,7-9,12" 
result = list() 

for item in s.split(','): 
    if '-' in item: 
     x,y = item.split('-') 
     result.extend(range(int(x), int(y)+1)) 
    else: 
     result.append(int(item)) 

print result 
+1

डाउनवोट क्यों? जहां तक ​​मैं कह सकता हूं, यह सही है। –

13
s = "2,5,7-9,12" 
ranges = (x.split("-") for x in s.split(",")) 
print [i for r in ranges for i in range(int(r[0]), int(r[-1]) + 1)] 

प्रिंट

[2, 5, 7, 8, 9, 12] 
+0

वास्तव में अच्छा है। हम इसे एक पंक्ति में भी जोड़ सकते हैं। – disfated

1

मैं किसी भी में निर्मित समारोह है कि क्या करना होगा कि के बारे में पता नहीं कर रहा हूँ। निम्नलिखित विशेष रूप से सुंदर नहीं है, लेकिन काम किया हो जाता है:

s = "2,5,7-9,12" 
ret = [] 
for tok in s.split(","): 
    val = map(int, tok.split("-")) 
    if len(val) == 1: 
    ret += val 
    else: 
    ret += range(val[0], val[1] + 1) 
print ret 

एक ऐसा क्षेत्र है जहां इस समाधान काम की आवश्यकता हो सकती ऋणात्मक संख्याओं की हैंडलिंग (यह आपके सवाल का नकारात्मक संख्या में दिखाई दे सकता है कि क्या से पूरी तरह स्पष्ट नहीं है इनपुट)।

+2

यह भी सही लगता है। डाउनवोट क्यों? –

+0

मेरे मामले में मुझे केवल सकारात्मक int को संभालना है, हालांकि सार्वभौमिक समाधान होना अच्छा है। – disfated

2

मैं समारोह निर्धारित करना होगा:

def make_range(s): 
    out = [] 
    s = s.split(',') 
    for n in s: 
     if '-' in n: 
      n = n.split('-') 
      for i in range(int(n[0]), int(n[1]) + 1): 
       out.append(i) 
     else: 
      out.append(int(n)) 
    return out 

print make_range("2,5,7-9,12") 
#output [2, 5, 7, 8, 9, 12] 
संबंधित मुद्दे