2016-11-13 1 views
1

Мне нужно разделить эту строку:найти целое число и строку из расщепленного предложения

"We shall win 100 dollars in the next 2 years" 

и возвращает кортеж со списком целых чисел и строк ([100,2],[We,shall,win,dollars,in,the,next,years]).

Мои попытки до сих пор:

lst_int =[] 
    lst_str =[] 
    tup_com =(lst_int,lst_str) 
    words = input_string.split() 
    for i in words: 
     if i == int(): 
      lst_int.append(i) 
     elif i != int(): 
      lst_str.append(i) 
    return tup_com 

ответ

0

Вы можете сделать это с помощью нескольких методов:

1) проверка isdigit:

sentence = "We shall win 100 dollars in the next 2 years" 

str_list=[] 
int_list=[] 
for word in sentence.split(): 
    if word.isdigit(): 
     int_list.append(int(word)) # cast at the same time 
    else: 
     str_list.append(word) 

Проблема: если число отрицательное, то вы должны проверить номера, содержащие знак минус, пробельные символы, которые по-прежнему считаются действительными числами, делает его более сложным для isdigit. Это может привести вас к регулярному выражению, которое является более сложным и открывает ящик Пандоры на целое число разбора с помощью регулярных выражений ... (и я даже не mentionning чисел с плавающей точкой)

2) полагаются на питон целочисленного разборе:

str_list=[] 
int_list=[] 
for word in sentence.split(): 
    try: 
     int_list.append(int(word)) 
    except ValueError: 
     str_list.append(word) 

Чуть медленнее из-за обработки исключений, но отлично работает во всех случаях и может быть даже обобщен для поплавков.

+0

Большое спасибо за прекрасное объяснение. Мерси beaucoup мсье! – Wanderer

0

Это может быть достигнуто, если вы немного измените свое состояние. i == int() действительно не делает то, что вы думаете; int() возвращает 0 так что вы по существу постоянно проверять, если i == 0, который всегда будет False (в результате чего все будет добавлен к lst_str

Вместо этого используйте str.isdigit в вашей for цикла, как так:.

if i.isdigit(): 
    lst_int.append(i) 
else: 
    lst_str.append(i) 

str.isdigit проходит через символы в строке, которую вы поставляете, и оценивает, все ли они цифры (и строка не пуста).

Затем tup_com результаты:

(['100', '2'], ['We', 'shall', 'win', 'dollars', 'in', 'the', 'next', 'years']) 

Как и в сторону, вам не нужно tup_com здесь, просто возвращают списки, разделенных запятой и кортеж создается, который содержит их.

То есть:

return lst_int, lst_str 
+0

большое спасибо – Wanderer

1

Вы можете сделать это с простым регулярным выражением

import re 
s = "We shall win 100 dollars in the next 2 years" 

t = (re.findall("[0-9]+",s),re.findall("[a-zA-Z]+",s)) 
+0

другой замечательный подход. Благодаря! – Wanderer

Смежные вопросы