2

Python初心者はこちら。さまざまな長さのリストを含むリストで基本的な機能を実行しようとしています。これらのリスト内には、範囲として使用する予定の要素のペアを含むタプルがあります。これらの要素を整数に変換してから、整数を使用して新しいタプルを作成し、その後2にイテレータを表す。を作成します。

私が欲しいl

l = [[('100', '200'), ('300', '400'), ('500', '600')], [('100', '200')], [('100', '200')]]

に置き換えられますl_upd

l_upd = [[(100, 200, 2), (300, 400, 2), (500, 600, 2)], [(100, 200, 2)], [(100, 200, 2)]]

これは明らかに機能しません(そして、要素として配置する方法を理解できませんでした2

l1 = []
l2 = []

for pairs in l:
    for pair in pairs:
        l1.append(int(i[0]))
        l2.append(int(i[1]))

l_upd = zip(l1, l2)

if編集: 、elseステートメントを含める必要があるため、リスト内包法は使用したくありません。一部の要素には文字が含まれ、一部は空です。

これらの例外には、次のようなものが必要です。

for pair in pairs:
    if pair[0].isdigit():
        addr_from.append(int(i[0]))
    elif pair[0].isalnum() is True and pair[0].isdigit is False:
        addr_from.append(re.sub(r'((?:[A-Z].*?)?(?:\d.*?)?[A-Z]+)(\d+)',r'\1%\2',pair[0]))
    else:
        addr_from.append(pair[0])
    if pair[1].isdigit():
        addr_to.append(int(i[1]) + 2)
    elif pair[1].isalnum() is True and pair[1].isdigit is False:
        addr_to.append(re.sub(r'((?:[A-Z].*?)?(?:\d.*?)?[A-Z]+)(\d+)',r'\1%\2',pair[1]))
4

2 に答える 2

3

あなたは仕事をするためにいくつかの再帰関数を書くことができます(これは関数が最大の再帰深度に達しない限りネストされたリストのあらゆるレベルを扱うことができることを意味します)

def addtwo(lst):
   new_lst = []
   for item in lst:
     if isinstance(item, list):
       new_lst.append(addtwo(item))
     elif isinstance(item, tuple):
       new_lst.append(item + (2,))

   return new_lst

l = [[('100', '200'), ('300', '400'), ('500', '600')], [('100', '200')], [('100', '200')]]
print addtwo(l)

#[[('100', '200', 2), ('300', '400', 2), ('500', '600', 2)], [('100', '200', 2)], [('100', '200', 2)]]
于 2013-03-14T00:17:58.447 に答える
3

リスト内包表記の使用:

>>> [[tuple(map(int, pair)) + (2,) for pair in pairs] for pairs in l]
[[(100, 200, 2), (300, 400, 2), (500, 600, 2)], [(100, 200, 2)], [(100, 200, 2)]]

またはマップなし:

>>> [[(int(a), int(b), 2) for a, b in pairs] for pairs in l]
[[(100, 200, 2), (300, 400, 2), (500, 600, 2)], [(100, 200, 2)], [(100, 200, 2)]]

編集

さらにチェックを行っても、リスト内包表記を使用できます。質問に追加した if/else セクションをすべてのペアに適用する必要があると仮定すると、結果のタプルは次のようになり(addr_from, addr_to, 2)ますよね?

def processPair(a, b):
    if a.isdigit():
        a = int(a)
    elif a.isalnum():
        a = re.sub(r'((?:[A-Z].*?)?(?:\d.*?)?[A-Z]+)(\d+)', r'\1%\2', a)
    if b.isdigit():
        b = int(b) + 2
    elif b.isalnum():
        b = re.sub(r'((?:[A-Z].*?)?(?:\d.*?)?[A-Z]+)(\d+)', r'\1%\2', b)
    return (a, b, 2)

(a, b)ここで、質問で行ったようにタプルを処理する関数を定義しました。グローバルリストに追加するのではなく、変数の値を変更して完成したタプル (2 を追加) を返すように変更したことに注意してください。

また、少し簡略化しました。すでにブール値を返しているa.isdigit() is Trueのと同じです。とa.isdigit()同じです。そのような状況では、冗長なチェックを削除することもできます。をチェックした後、反対側をチェックする必要はありません。以前にチェックしたので、false であることが保証されています。a.isdigit() == Falsenot a.isdigit()a.isdigit()ifelif

そうは言っても、関数を指定したら、リスト内包表記を再度使用して出力を取得できます。もちろん、あなたの例lでは、これは少し退屈です:

>>> [[processPair(*pair) for pair in pairs] for pairs in l]
[[(100, 202, 2), (300, 402, 2), (500, 602, 2)], [(100, 202, 2)], [(100, 202, 2)]]
于 2013-03-14T00:18:58.090 に答える