2011-04-18 26 views
5

Tôi có chuỗi "2,5,7-9,12".phân tích chuỗi các tập số nguyên với khoảng thời gian để liệt kê

Tôi muốn nhận danh sách [2, 5, 7, 8, 9, 12] từ đó.

Có chức năng tích hợp nào cho nó trong python không?

Cảm ơn.

UPD. Tôi cho rằng câu trả lời thẳng là Không. Dù sao, cảm ơn cho "đoạn trích" của bạn. Sử dụng một, được đề xuất bởi Sven Marnach.

+0

Một trùng lặp. http://stackoverflow.com/questions/712460/interpreting-number-ranges-in-python –

Trả lời

1

This version xử lý khoảng trắng tùy ý, chồng chéo dãy, dãy out-of-trật tự, và số nguyên âm:

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

Không phải là tôi biết, nhưng bạn có thể dễ dàng làm của riêng bạn:

  1. Tạo một danh sách kết quả.
  2. Tách chuỗi theo , và bắt đầu lặp lại kết quả.
    1. Nếu chuỗi hiện tại chứa - nối thêm một dải vào danh sách.
    2. Nếu chuỗi hiện tại là một số, hãy thêm nó vào danh sách.
    3. Khác trả về lỗi.
  3. Trả lại danh sách.
+0

Một người nào đó phải có tâm trạng xấu để từ chối tất cả các câu trả lời đúng đó. Tôi sẽ đưa họ trở lại số không :) –

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

Tại sao downvote? Theo như tôi có thể nói, điều này là chính xác. –

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)] 

in

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

Thực sự tốt đẹp. Chúng tôi thậm chí có thể kết hợp nó trong một dòng. – disfated

1

Tôi không biết về bất kỳ chức năng được xây dựng trong đó sẽ làm điều đó. Sau đây không phải là điều đặc biệt thanh lịch, nhưng hoàn thành công việc:

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 

Một giải pháp có thể cần làm là xử lý các số âm (không hoàn toàn rõ ràng là câu hỏi của bạn có thể xuất hiện số âm) đầu vào).

+2

Điều này có vẻ đúng. Tại sao downvote? –

+0

Trong trường hợp của tôi, tôi chỉ phải xử lý int tích cực, mặc dù nó là tốt để có giải pháp phổ quát. – disfated

2

tôi sẽ xác định chức năng:

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] 
Các vấn đề liên quan