PHP コードに基づいて Python コードを構築しようとしています。
私が苦労しているのは、Python の三項演算子です。
タイトルにあるように、文字列内の大文字を「1」に置き換えたいと考えています。小文字は「0」で構成されます。
String1: 00X2I00000ABCDa
Expected result1: 111111111111110
PHP コード
$bits .= (!is_numeric($char) && $char == strtoupper($char)) ? '1' : '0';
これは完全な PHP スクリプトです
ありがとうございます!
"".join(["0" if i.is lower() else "1" for i in s])?
– クリス
2020 年 9 月 3 日 10:27
PHP コードが期待どおりの結果を得るという確信が持てません。
– アラニ
2020 年 9 月 3 日 10:29
正規表現ソリューションには興味がないと思いますか?
– ミックマックサ
2020 年 9 月 3 日 10:42
期待された結果が説明を満たしていません。大文字が X の場合、期待される出力ではなぜ 1 になるのでしょうか?
–
user13824946
2020 年 9 月 3 日 10:54
------------------------
c = "00X2I00000ABCDa"
''.join(map(str, [1 if c.isupper() or c.isnumeric() else 0 for c in a]))
ここで、c は入力文字列です
------------------------
join() の使用:
s = '00X2I00000ABCDa'
print("".join(["1" if x.isupper() or x.isnumeric() else "0" for x in s]))
出力:
111111111111110
------------------------
単一の文字に対して期待どおりの結果を得るには、次のようにします。
bits += '0' if char.islower() else '1'
ただし、必要に応じて、文字列全体の変換をワンライナーで記述することもできます。
bits = ''.join('0' if char.islower() else '1' for char in string1)
これにより、次のようになります。
111111111111110
ただし、質問に示されている PHP コードが実際に期待どおりの結果をもたらすかどうかはわかりません。 Python に相当するものは次のようになります。
bits = ''.join('1' if not char.isnumeric() and char == char.upper() else '0'
for char in string1)
次とほぼ同等:
bits = ''.join('1' if char.isupper() else '0'
for char in string1)
これにより次のことが得られます:
001010000011110
それでは、お好きなものを選んでください...
(注: 英数字以外の文字など、考慮すべき他のケースがあるため、上記では「ほぼ同等」とだけ述べています。そうです。)
------------------------
結果も文字列として取得したいと仮定します。
string1 = '00X2I00000ABCDa'
result = "".join(["0" if i.islower() else "1" for i in string1])
print(result)
>>> '111111111111110'
これを詳しく説明すると、次のようになります。
「0」 i.is lower() が文字「」を含む文字列を作成する場合、 True を返す islower メソッドがある場合。小文字の文字列のみがこのプロパティを持ちます。
else "1"それ以外の場合は、「1」を含む文字列が作成されます。そして、文字列 string1 内の各項目 (単一の文字列) として i に対してこれを実行します。
これらすべてを [ ] 内に入れると、次の値のリストが作成されます。
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0','0'、'0'、'1']
次に、空の文字列 '' に対して join メソッドを使用して、このリスト内のすべての単一文字列を単一の文字列に結合し、それを結果に割り当てます。