0

私はPythonに手を出し始めたばかりで、learnpython.orgの章を読み始めました。「ループ」の章では、次のコードで課題を解決しました。しかし、それが最も効率的かどうかはわかりません。「超えない数」を2回定義しなければならないので、確かにそうではないようです。この(私が推測している)簡単な問題では、DRYは順守できるはずですよね?

演習は_

ループして、番号リストから受け取ったのと同じ順序ですべての偶数を印刷します。シーケンスの237の後に続く数字は印刷しないでください。

私のコード:

numbers = [ 951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547, 544, 615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105, 942, 941, 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958, 609, 842, 451, 688, 753, 854, 685, 93, 857, 440, 380, 126, 721, 328, 753, 470, 743, 527 ]

# My Solution
for x in numbers:
  if x != 237:
    if x % 2 == 0:
      print x
  if x == 237:
    break
4

6 に答える 6

2

それが何のためelseであるかelif

for x in numbers:
  if x == 237:
    break
  elif x % 2 == 0:
    print x
于 2013-01-26T12:48:30.163 に答える
1

これも可能です:

try:
    i = numbers.index(237)
except:
    i = len(numbers)
for n in numbers[:i]:
    if not n%2:
       print n
于 2013-01-26T13:07:34.403 に答える
1

別の方法は、itertools常に何らかの方法で役立つを使用しています。

>>> from itertools import takewhile, ifilter
>>> not_237 = takewhile(lambda L: L != 237, numbers)
>>> is_even = ifilter(lambda L: L % 2 == 0, not_237)
>>> list(is_even)
[402, 984, 360, 408, 980, 544, 390, 984, 592, 236, 942, 386, 462, 418, 344, 236, 566, 978, 328, 162, 758, 918]

そこで、237 で停止する遅延反復子を作成し、その偶数から取得します。

于 2013-01-26T12:55:27.987 に答える
0

リスト内包表記を使用してそれを行うことができます

解決策は次のようになります。

numbers = [x for ind,x in enumerate(numbers) if x % 2== 0 and numbers[ind+1]!=237 ]
于 2015-09-29T05:58:44.840 に答える