3

だから私はタプルに文字列を配布しようとしています。例えば:

x = ["a", ("b", ("c", "d"))]

その後、私はしたいです

x = ["a", ("bc", "bd")]

そして最後に:

x = ["abc", "abd"]  

ただし、タプルは常に 2 番目の要素である必要はありません。例:

x = [(("c", "d"), "b"), "a"]

次のように簡略化します。

x = [("cb", "db"), "a"]

そして最後に:

x = ["cba", "dba"]

最初の式を直接最後まで単純化する単一の関数をどのように作成するのか疑問に思っています。

私がこれまでに試したことは次のとおりです。

def distribute(x):
    if isinstance(x, list) and any([True if isinstance(o, tuple) else False for o in x]):
        if isinstance(x[0], tuple):
            return (x[0][0] + x[1], x[0][1] + x[1])
        else:
            return (x[0] + x[1][0], x[0] + x[1][1])

print (distribute(["a", ("b", "c")]))

最終編集: 私の 2 番目の例で動作するように編集された Oscars コード:

def dist(tpl):
    if not isinstance(tpl[1], tuple) and not isinstance(tpl[0], tuple):
        return tpl
    if isinstance(tpl[1], tuple):
        ret = dist(tpl[1])
        return [tpl[0] + ret[0], tpl[0] + ret[1]]
    elif isinstance(tpl[0], tuple):
        ret = dist(tpl[0])
        return [ret[0] + tpl[1], ret[1] + tpl[1]]

助けてくれてありがとう!

4

1 に答える 1

4

これを試してみてください。タプルの両方の要素が同時にタプルになることは決してないという仮定の下で、質問の両方の例で機能する再帰的なソリューションです。

def dist(tpl):
    if not isinstance(tpl[0], tuple) and not isinstance(tpl[1], tuple):
        return tpl
    elif isinstance(tpl[0], tuple):
        ret = dist(tpl[0])
        return [ret[0] + tpl[1], ret[1] + tpl[1]]
    else:
        ret = dist(tpl[1])
        return [tpl[0] + ret[0], tpl[0] + ret[1]]

期待どおりに動作します:

dist(["a", ("b", ("c", "d"))])
=> ['abc', 'abd']

dist([(("c", "d"), "b"), "a"])
=> ['cba', 'dba']
于 2013-11-04T21:46:58.033 に答える