2009-09-25 16 views
2

Каков наилучший способ преобразования строки в формате "1-2-3-4" в список [1, 2, 3, 4]? Строка также может быть пустой, и в этом случае преобразование должно возвращать пустой список [].Python: «1-2-3-4» до [1, 2, 3, 4]

Это то, что у меня есть:

map(lambda x: int(x), 
    filter(lambda x: x != '', 
      "1-2-3-4".split('-'))) 

EDIT: К сожалению, все из тех, кто ответил, прежде чем я исправил мой вопрос, было неясно, в течение первой минуты или около того.

+0

вы понимаете, что вы не проверяете пустую строку, не так ли? вы проверяете, является ли элемент нового списка пустой строкой. это разные вещи. – SilentGhost

+0

@SilentGhost: Я понимаю, что мой алгоритм можно сделать по-другому, но мой подход также работает. '." .split ("-") 'возвращает' [""] '. Асимптотическая временная сложность моего алгоритма хуже, чем идеальная, но в этом случае она ничтожна. –

ответ

12

Вы можете использовать список, чтобы его уменьшить. Используйте if для учета пустой строки.

the_string = '1-2-3-4' 

[int(x) for x in the_string.split('-') if x != ''] 
+0

Почему вы проверяете пустую строку? – SilentGhost

+0

SilentGhost, вопрос гласит, что в случае пустой строки он должен возвращать пустой список: «Строка также может быть пустой, и в этом случае преобразование должно возвращать пустой список []». –

+0

, так почему вы делаете это так, как вы это делаете? вы не знаете, какой объект оценивается False? – SilentGhost

8
>>> for s in ["", "0", "-0-0", "1-2-3-4"]: 
...  print(map(int, filter(None, s.split('-')))) 
... 
[] 
[0] 
[0, 0] 
[1, 2, 3, 4] 
+0

Простите, теперь я исправил свой вопрос. –

+0

@blahblah, я тоже обновил свой ответ –

+0

Это не будет касаться пустого корпуса. – voyager

4

Преобразование функции высшего порядка в более удобном для восприятия списка-понимания

[ int(n) for n in "1-2-3-4".split('-') if n != '' ] 

Остальное прекрасно.

2

Из формата вашего примера вы хотите, чтобы int в списке. Если это так, вам нужно будет преобразовать строки в int. Если нет, то вы закончите после разделения строки.

text="1-2-3-4" 

numlist=[int(ith) for ith in text.split('-')] 
print numlist 
[1, 2, 3, 4] 

textlist=text.split('-') 
print textlist 
['1', '2', '3', '4'] 

EDIT: Пересмотр моего ответа, чтобы отразить обновление в вопросе.

Если список может быть искажен, тогда «попробуйте ... поймать», если ваш друг. Это обеспечит, чтобы список был либо сформирован, либо вы получили пустой список.

>>> def convert(input): 
...  try: 
...   templist=[int(ith) for ith in input.split('-')] 
...  except: 
...   templist=[] 
...  return templist 
...  
>>> convert('1-2-3-4') 
[1, 2, 3, 4] 
>>> convert('') 
[] 
>>> convert('----1-2--3--4---') 
[] 
>>> convert('Explicit is better than implicit.') 
[] 
>>> convert('1-1 = 0') 
[] 
0
def convert(s): 
    if s: 
     return map(int, s.split("-")) 
    else: 
     return [] 
0

вам не нужно лямбда, и раскол не даст вам пустые элементы:

map(int, filter(None,x.split("-"))) 
+0

К сожалению, это разбивается на пустые строки. – mipadi

+0

hmmm ... Я не заметил, что split вернет пустую строку, если входной файл пустой строки (я думал, что он возвращает пустой список). Исправлено с фильтром – fortran

1

Я бы с этим:

>>> the_string = '1-2-3-4- -5- 6-' 
>>> 
>>> [int(x.strip()) for x in the_string.split('-') if len(x)] 
[1, 2, 3, 4, 5, 6] 
Смежные вопросы