0

私は、数値を受け取り、それを2進数に変換し、2進数の合計を返す単純なPythonスクリプトに取り組んでいます。これが私がこれまでに持っているものです。

#!/usr/bin/python

def sum2(n):
    a = str(bin(n))
    b = a.replace('0b', '')
    return sum([map(int, x) for x in b])

n = int(raw_input("Input number>"))
print sum2(n)

平易な英語では、nを取り、それをバイナリに変換してから、文字列に変換します。( bin()から) 0bを切り取り、バイナリ文字をintのリストに変換してから、それらをsum()しようとします。

数字を足し合わせる方法を見つけようとしたとき、私はグーグルで調べて、intのリストをsum()できるはずだとわかりました。これを実行しようとすると、このトレースバックが発生します。

Traceback (most recent call last):
  File "D:\scripts\sum2n1.py", line 9, in <module>
    print sum2(x)
  File "D:\scripts\sum2n1.py", line 6, in sum2
    return sum([map(int, x) for x in b])
TypeError: unsupported operand type(s) for +: 'int' and 'list'

だから私はsum()がその仕事をするために「反復可能」を必要としていることを知りました。グーグルで検索すると、呼び出すことができるiter()関数があることがわかりましたが、機能していないようです。

There's also __iter__() which doesn't work either.

誰かが私が間違っていることを教えてもらえますか?私はまだかなりの初心者です。前もって感謝します。

(いいえ、それは私の宿題ではありません。)

4

7 に答える 7

6

なぜ単純ではないのですか

def sum2(n):
    return sum(x=='1' for x in bin(n))

またはさらに単純に

def sum2(n):
    return bin(n).count('1')
于 2012-07-18T04:41:47.593 に答える
5

リスト内包表記とmap関数を組み合わせて、同じことを2回実行しようとしているようです。あなたはどちらかが欲しい:

sum(int(x) for x in b)

また

sum(map(int, b))
于 2012-07-18T04:28:00.963 に答える
3

これは機能します:

def sum2(n):
    idx = 3 if n < 0 else 2 # adjust index for slice based on neg/pos number
    a = bin(n)[idx:]        # doesn't assign the '0b' (or '-0b' for negatives)

    return sum(int(i) for i in a)  # convert chars into ints and sum

スライス表記を使用して先頭を削除する'0b'か、'-0b'を使用するよりも望ましいことに注意してくださいreplace()

これには、リスト内包表記またはジェネレータ式を使用できます。

更新

@DSM'-0b'は、バイナリ文字列の前に負の数があることを指摘した有益なコメントで、数値の符号に基づいてスライスを調整することで、これに対処するようにコードを更新しました。

于 2012-07-18T04:27:02.670 に答える
2

代わりにあなたの帰りにこれをやってみてください

return sum(map(int,b))

それはうまくいくはずです

于 2012-07-18T04:26:56.037 に答える
2

を行うことにより[map(int, x) for x in b]、同じことを2回行うことになります。 map(int, b)各桁をintにします。または[int(x) for x in b]同じことをします。しかし、あなたは両方をやっています。どちらかを選択してください。試す:

sum([int(x) for x in b])
于 2012-07-18T04:27:03.953 に答える
1

マップ内包表記でマップ呼び出しをラップしないでください。

それ以外の

return sum([map(int, x) for x in b])

これを行う:

return sum(map(int, b))
于 2012-07-18T04:29:39.833 に答える
0

削減を使用するもの:

ans = reduce(lambda x,y:int(x)+int(y), L)
于 2012-07-18T04:43:56.027 に答える