9

質問する前に、グーグルで検索しましたが、答えが見つかりませんでした。

私が持っているシナリオは次のとおりです。ファイルを介して\nで区切られた、またはコマンドライン引数を介してカンマで区切られた番号のリストがスクリプトに渡されます。数値は、次のように単数またはブロック単位にすることができます。

ファイル:

1
2
3
7-10
15
20-25

コマンドライン引数:

1, 2, 3, 7-10, 15, 20-25

どちらも同じリスト [] になります。7 ~ 10 または 20 ~ 25 のブロックを展開し (実際のスクリプトでは、これらの数字は明らかに異なります)、それらを新しいリストに追加して、最終的なリストを次のようにします。

['1','2','3','7','8','9','10','15','20','21','22','23','24','25']

ここで .append(range(7,10)) のようなものが役立つことは理解していますが、元の list[] のどの要素に拡張が必要かを見つけることができないようです。

だから、私の質問はこれです:リスト[]が与えられた場合:

['1','2','3','7-10','15','20-25'],

リストを取得する方法[]:

 ['1','2','3','7','8','9','10','15','20','21','22','23','24','25']
4

3 に答える 3

14

それでは、リストが与えられたとしましょう:

L = ['1','2','3','7-10','15','20-25']

そして、そこに含まれるすべての範囲を展開したいとします:

answer = []
for elem in L:
    if '-' not in elem:
        answer.append(elem)
        continue
    start, end = elem.split('-')
    answer.extend(map(str, range(int(start), int(end)+1)))

もちろん、これには便利なワンライナーがあります。

answer = list(itertools.chain.from_iterable([[e] if '-' not in e else map(str, range(*[int(i) for i in e.split('-')]) + [int(i)]) for e in L]))

しかし、これは python2.7 のリーキー変数の性質を悪用しており、これは python3 では機能しないと思います。また、これは必ずしも最も読みやすいコード行ではありません。だから、もし私があなただったら、本番環境ではあまり使わないでしょう...あなたが本当にマネージャーを嫌わない限り。

参考文献:  append()  continue  split()  extend()  map()  range()  list()  itertools.chain.from_iterable()  int()

于 2015-05-12T20:52:36.213 に答える
2

入力:

arg = ['1','2','3','7-10','15','20-25']

出力:

out = []
for s in arg:
    a, b, *_ = map(int, s.split('-') * 2)
    out.extend(map(str, range(a, b+1)))

または (Python 2 の場合):

out = []
for s in arg:
    r = map(int, s.split('-'))
    out.extend(map(str, range(r[0], r[-1]+1)))
于 2015-05-12T21:06:51.613 に答える
0

古き良き map + reduce が重宝します:

>>> elements = ['1','2','3','7-10','15','20-25']
>>> reduce(lambda original_list, element_list: original_list + map(str, element_list), [[element] if '-' not in element else range(*map(int, element.split('-'))) for element in elements])
['1', '2', '3', '7', '8', '9', '15', '20', '21', '22', '23', '24']

20-25 に 25 も含めたいという点を除けば、これでうまくいきます。

reduce(
    lambda original_list, element_list: original_list + map(str, element_list), 
    [[element] if '-' not in element 
     else range(int(element.split('-')[0]), int(element.split('-')[1]) + 1) 
     for element in elements])

これでうまくいきますが、おそらくいくつかの for ループを使用したほうがよいでしょう。それが、Python 3 で reduce を削除した理由です。

于 2015-05-12T23:15:31.737 に答える