2016-08-20 3 views
1

私は文字列が"1-3 6:10-11 7-9"であり、それらから次のように数字セットを作成したいと考えています。{1,2,3,6,10,11,7,8,9}番号の範囲からセットを作成するためのPython - 文字列からセットを作成する

が、私は次のコードを持っている:

def create_set(src): 
    lset = [] 
    if len(src) > 0: 
     pos = src.find('-') 
     if pos != -1: 
      first = int(src[:pos]) 
      last = int(src[pos+1:]) 
     else: 
      return [int(src)] # Only one number 
     for j in range (first, last+1): 
      lset.append(j) 
     return set(lset) 

をしかし、私は正しく治療する方法を見つけ出すことができません「:」それは、文字列で表示されたとき。誰か助けてくれますか?

ありがとうございます!

編集:ところで、おそらく正規表現を使用して、そのような文字列を解析するよりコンパクトな方法はありますか?

+0

を、私は正規表現でそれを解析するために誘惑されるだろう - 私は専門家でないが、それは私がそれを行うだろう方法だろう - 「構文は」定期的のようですので、。 –

+0

@xnx私の考えはちょうど –

+1

なぜ6は結腸を持っていますか? –

答えて

1

EDITを:ところで、 は、おそらく正規表現を使用して、このような文字列を解析し、よりコンパクトな方法はありますか?

おそらくクリーナー(少しより効率的な)方法:

import re 
import itertools 

allGroups = re.findall(r"(\d+)(?:-(\d+)|:)", s) 
expanded = [range(int(x), (int(x) if y == '' else int(y)) + 1) for x, y in allGroups] 
print {x for x in itertools.chain.from_iterable(expanded)} 

説明:

マッチ 'AB' など、すべての文字列 ':' と(のリストを返し、 b)および(それぞれ、 '')対は:

allGroups = re.findall(r"(\d+)(?:-(\d+)|:)", s) 

これは生成:

[('1', '3'), ('6', ''), ('10', '11'), ('7', '9')] 

リストの理解を使用すると、(x、y)を(x、y + 1)の完全なリストに展開し、(x、 X + 1):

expanded = [range(int(x), (int(x) if y == '' else int(y)) + 1) for x, y in allGroups] 

これが生成します。

[[1, 2, 3], [6], [10, 11], [7, 8, 9]] 

使用itertools.chain.from_iterable()を最終セットに集合理解によって繰り返される単一のiterableにリストのリストを変換する:

print {x for x in itertools.chain.from_iterable(expanded)} 

これが生成します。

set([1, 2, 3, 6, 7, 8, 9, 10, 11]) 
+0

ありがとう、FujiApple、このソリューションは、ソートされた数字のリストを返すという利点もあります。 – maurobio

5

このような何かがあなたのために働くかもしれない:

s = '1-3 6:10-11 7-9' 
s = s.replace(':', ' ') 
lset = set() 
fs = s.split() 
for f in fs: 
    r = f.split('-') 
    if len(r)==1: 
     # add a single number 
     lset.add(int(r[0])) 
    else: 
     # add a range of numbers (inclusive of the endpoints) 
     lset |= set(range(int(r[0]), int(r[1])+1)) 
print(lset) 
+0

ありがとう、xnx!それは完璧に働いた! – maurobio

+0

この回答はうまくいきますが、代わりに、おそらくもっと簡単なオプションの場合は、以下のようになります。 – FujiApple

関連する問題