ここに私の問題があります:私は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つのループを回避する簡単な方法はありますか、それともすでに最も簡単な方法ですか?
あなたが持っているコードは、それが得るのと同じくらい良いです。マイナーな改善点の 1 つは、インデックスを作成するのではなく、外側のループで辞書の項目を反復処理することです。
for i, lst in a.items() # use a.iteritems() in Python 2
for j in lst:
print("{}, {}".format(i, j))
明示的な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
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}