Я думаю, что это решение не самое лучшее, поскольку оно работает только для int
, но я думаю, что это отлично для новичков.
public class NumberWordConverter { public static final String [] units = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten «одиннадцать», «двенадцать», «тринадцать», «четырнадцать», «пятнадцать», «шестнадцать», «семнадцать», «восемнадцать», «девятнадцать»); public static final String [] tens = {"", // 0 "", // 1 "двадцать", // 2 "тридцать", // 3 "сорок", // 4 "пятьдесят", // 5 " шестьдесят ", // 6" семьдесят ", // 7" восемьдесят ", // 8" девяносто "// 9}; public static String convert (final int n) {if (n & lt; 0) {return "минус" + convert (-n); } if (n & lt; 20) {return units [n]; } if (n & lt; 100) {return tens [n / 10] + ((n% 10! = 0)? "": "") + единиц [n% 10]; } if (n & lt; 1000) {возвратные единицы [n / 100] + "сто" + ((n% 100! = 0)? "": "") + конвертировать (n% 100); } if (n & lt; 1000000) {return convert (n / 1000) + "тыс." + ((n% 1000! = 0)? "": "") + конвертировать (n% 1000); } if (n & lt; 1000000000) {return convert (n / 1000000) + "million" + ((n% 1000000! = 0)? "": "") + convert (n% 1000000); } return convert (n / 1000000000) + «миллиард» + ((n% 1000000000! = 0)? "": "") + конвертировать (n% 1000000000); } public static void main (final String [] args) {final Random generator = new Random (); int n; for (int i = 0; i & lt; 20; i ++) {n = generator.nextInt (Integer.MAX_VALUE); System.out.printf ("% 10d = '% s'% n", n, convert (n)); } n = 1000; System.out.printf ("% 10d = '% s'% n", n, convert (n)); n = 2000; System.out.printf ("% 10d = '% s'% n", n, convert (n)); n = 10000; System.out.printf ("% 10d = '% s'% n", n, convert (n)); n = 11000; System.out.printf ("% 10d = '% s'% n", n, convert (n)); n = 999999999; System.out.printf ("% 10d = '% s'% n", n, convert (n)); n = Integer.MAX_VALUE; System.out.printf ("% 10d = '% s'% n", n, convert (n)); }}
Тест создает 20 случайных чисел до Integer.MAX_VALUE
, а некоторые из них знают, что они проблематичны из-за 0, 10 и т. д. Выход :
5599908 = «пять миллионов пятьсот девяносто девять тысяч девятьсот восемь» 192603486 = «сто девяносто два миллиона шестьсот три тысячи четыреста восемьдесят шесть» 1392431868 = «один миллиард триста девяносто два миллиона четыреста тридцать одна тысяча восемьсот шестьдесят восемь »1023787010 =« один миллиард двадцать три миллиона семьсот восемьдесят семь тысяч десять »1364396236 =« один миллиард триста шестьдесят четыре миллиона триста девяносто шесть тысяч двести тридцать шесть »1511255671 = один миллиард пятьсот одиннадцать миллионов двести пятьдесят пять тысяч шестьсот семьдесят один «225955221 =« двести двадцать пять миллионов девятьсот пятьдесят пять тысяч двести двадцать один »1890141052 =« один миллиард восемьсот девяносто миллионов сто сорок одна тысяча пятьдесят два '261839422 =' два сто шестьдесят один миллион восемьсот тридцать девять тысяч четыреста двадцать два »728428650 =« семьсот двадцать восемь миллионов четыреста двадцать восемь тысяч шестьсот пятьдесят »860607319 =« восемьсот шестьдесят миллионов шестьсот семь тысяч триста девятнадцать »719753587 =« семь сто девятнадцать миллионов семьсот пятьдесят три тысячи пятьсот восемьдесят семь »2063829124 =« два миллиарда шестьдесят три миллиона восемьсот двадцать девять тысяч сто двадцать четыре »1081010996 =« один миллиард восемьдесят один миллион десять тысяч девятьсот девяносто шесть »999215799 =« девять сто девяносто девять миллионов двести пятнадцать тысяч семьсот девяносто девять »2105226236 =« два миллиарда сто пять миллионов двести двадцать шесть тысяч двести тридцать шесть »1431882940 =« один миллиард четыреста тридцать один миллион восемьсот восемьдесят две тысячи девятьсот сорок '1991707241 =' один миллиард девятьсот девяносто один миллион семьсот семь тысяч две сотни форт y one '1088301563 =' один миллиард восемьдесят восемь миллионов триста одна тысяча пятьсот шестьдесят три '964601609 =' девятьсот шестьдесят четыре миллиона шестьсот одна тысяча шестьсот девять '1000 =' одна тысяча '2000 =' две тысячи '10000 = «десять тысяч» 11000 = «одиннадцать тысяч» 999999999 = «девятьсот девяносто девять миллионов девятьсот девяносто девять тысяч девятьсот девяносто девять» 2147483647 = «два миллиарда сто сорок семь миллионов четыреста восемьдесят три тысячи шестьсот сорок семь»
Надеюсь, что это поможет:)
True
является 1
в Python, а также False
является 0
*:
>>> True == 1
True
>>> False == 0
True
Вы должны иметь возможность выполнять любые операции, которые вы хотите на них, просто обрабатывая их как если бы они были числами, поскольку они являются номерами:
>>> issubclass(bool, int)
True
>>> True * 5
5
Итак, чтобы ответить на ваш вопрос, никакой работы не требуется - у вас уже есть то, что вы ищете.
* Примечание. Я использую как как английское слово, а не ключевое слово Python is
- True
не будет тем же объектом, что и любой случайный 1
.
Вы также можете сделать это непосредственно на фреймах
In [104]: df = DataFrame(dict(A = True, B = False),index=range(3))
In [105]: df
Out[105]:
A B
0 True False
1 True False
2 True False
In [106]: df.dtypes
Out[106]:
A bool
B bool
dtype: object
In [107]: df.astype(int)
Out[107]:
A B
0 1 0
1 1 0
2 1 0
In [108]: df.astype(int).dtypes
Out[108]:
A int64
B int64
dtype: object
Просто умножьте свой Dataframe на 1 (int)
[1]: data = pd.DataFrame([[True, False, True], [False, False, True]])
[2]: print data
0 1 2
0 True False True
1 False False True
[3]: print data*1
0 1 2
0 1 0 1
1 0 0 1
Чтобы точно ответить на вопрос о том, как преобразовать один столбец логических значений в столбец целых чисел 1 или 0:
df.somecolumn = df.somecolumn.astype(int)
np.sin(True).dtype
для меня float16. – jorgeca 29 June 2013 в 19:09df.my_column.mean()
просто отлично (как вы подразумеваете), но когда я пытаюсь:df.groupby("some_other_column").agg({"my_column":"mean"})
, я получаюDataError: No numeric types to aggregate
, поэтому, похоже, они NOT всегда одно и то же. Просто FYI. – dwanderson 15 December 2016 в 22:10