2

ここに私の問題があります:私はPythonで次のような口述を持っています:

a = {1:[2, 3], 2:[1]}

出力したい:

1, 2
1, 3
2, 1

私がしていることは

for i in a:
    for j in a[i]:
        print i, j 

ここで2つのループを回避する簡単な方法はありますか、それともすでに最も簡単な方法ですか?

4

3 に答える 3

3

あなたが持っているコードは、それが得るのと同じくらい良いです。マイナーな改善点の 1 つは、インデックスを作成するのではなく、外側のループで辞書の項目を反復処理することです。

for i, lst in a.items() # use a.iteritems() in Python 2
    for j in lst:
        print("{}, {}".format(i, j))
于 2013-01-20T17:01:04.903 に答える
0

明示的なforループを避けたい場合は、リスト内包表記を使用するいくつかの選択肢。

#1の方法

# Python2.7
for key, value in a.iteritems():    # Use a.items() for python 3
    print "\n".join(["%d, %d" % (key, val) for val in value])

#2の方法-リスト内包表記を使用したより洗練された方法

print "\n".join(["\n".join(["%d, %d" % (key, val) for val in value]) for key, value in a.iteritems()])

両方とも出力します

1, 2
1, 3
2, 1
于 2013-01-20T17:05:59.623 に答える
0

Python で覚えてReadability counts.いるので、理想的には @Blckknght の解決策を期待する必要がありますが、問題を技術的に POC として見るだけで、式を単一のループとして書き直すことができます。ここに解決策があります。

ただし、コードを読みやすくしたくない場合は、覚えておいてくださいExplicit is better than implicit.

>>> def foo():
    return '\n'.join('{},{}'.format(*e) for e in chain(*(izip(cycle([k]),v) for k,v in a.items())))

>>> def bar():
    return '\n'.join("{},{}".format(i,j) for i in a for j in a[i])

>>> cProfile.run("foo()")
         20 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <pyshell#240>:1(foo)
        5    0.000    0.000    0.000    0.000 <pyshell#240>:2(<genexpr>)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
       10    0.000    0.000    0.000    0.000 {method 'format' of 'str' objects}
        1    0.000    0.000    0.000    0.000 {method 'items' of 'dict' objects}
        1    0.000    0.000    0.000    0.000 {method 'join' of 'str' objects}


>>> cProfile.run("bar()")
         25 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <pyshell#242>:1(bar)
       11    0.000    0.000    0.000    0.000 <pyshell#242>:2(<genexpr>)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
       10    0.000    0.000    0.000    0.000 {method 'format' of 'str' objects}
        1    0.000    0.000    0.000    0.000 {method 'join' of 'str' objects}
于 2013-01-20T17:29:55.440 に答える