2016-01-11 3 views
1

Я следующий список (фактический файл гораздо больше и сложный)Использования расколоть для конкретных элементов многомерного списка

a = [[['3x5'], ['ff']], [['4x10'], ['gg']]] 

Я хотел бы использовать функцию разделения для первого элемента в списке и получить значение, которое появляется после «x». Окончательные результаты должны быть 5 и 10 в этом случае. Я пытался использовать раскол в этом формате

for line in a: 
    print str(line[0]).split("x")[1] 

но выход

5'] 
10'] 

Я знаю, что могу легко манипулировать выход, чтобы получить 5 и 10, но то, что это правильный способ использования раскола в этом дело?

И меня интересует использование split для определенного элемента списка (первые элементы в этом случае).

ответ

2

Вы не должны список для строкового объекта, однако, вы можете сделать это с помощью:

>>> [i[0][0].split('x')[1] for i in a] 
['5', '10'] 

Я думаю, вы также хотите, чтобы преобразовать вывод INT объект, то вы можете просто добавьте int(), как показано ниже:

>>> [int(i[0][0].split('x')[1]) for i in a] 
[5, 10] 

Однако, если вам не нужно сохранить вывод в список, но напечатать его вместо этого, вы можете просто использовать один и тот же код, но написать еще одну версию:

a = [[['3x5'], ['ff']], [['4x10'], ['gg']]]          
for i in a:           
    print(i[0][0].split('x')[1]) 

Выход:

5 
10 

Помните, что мой код не удалось (поднять IndexError: list index out of range), когда a есть ... Например, [[['3x5'], ['ff']], [['kk'], ['gg']]] (первый элемент в одном из подписок не в формате '3x5').

Однако простой if можно исправить:

>>> a = [[['3x5'], ['ff']], [['kk'], ['gg']]] 
>>> [int(i[0][0].split('x')[1]) for i in a] 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "<input>", line 1, in <listcomp> 
IndexError: list index out of range 

>>> [int(i[0][0].split('x')[1]) for i in a if 'x' in i[0][0]] 
[5] 

Или еще лучше, использовать регулярные выражения для проверки, что позволяет избежать что-то вроде a = [[['3x5'], ['ff']], [['xxxxxxx'], ['gg']]]:

>>> import re 
>>> a = [[['3x5'], ['ff']], [['xxxxxxx'], ['gg']]] 
>>> [int(i[0][0].split('x')[1]) for i in a if re.search(r'\d+x\d+', i[0][0])] 
[5] 

Другой способ, если вы не» t want import re:

>>> [int(i[0][0].split('x')[1]) for i in a 
... if all(j.isdigit() for j in i[0][0].split('x'))] 
[5] 
+0

Спасибо Kevin, ваше решение, а также решение Tim для образца, который я написал. Но проблема в том, что меня интересует только первый элемент списка.Если, например, где-то еще есть «x», ваше решение также вернет это значение. Например, если a = [[['3x5'], ['ff']], [['4x10'], ['5x12']]], выход будет 5, 10 и 12! – Hamed

+1

@ Имущественные требования, такие как те, должны быть объяснены в вопросе. Теперь отредактируйте его и запомните в следующий раз. –

+0

@ Hamed: Хорошо, я уже отредактировал свой ответ. Теперь он также дает '5' и' 10', когда 'a = [[['3x5'], ['ff']], [['4x10'], ['5x12']]]', спасибо за редактирование вашего вопрос. –

3

Вам нужно погрузиться на один уровень глубже и не использовать str() в списке.

>>> a = [[['3x5'], ['ff']], [['4x10'], ['gg']]] 
>>> for y in a: 
... if 'x' in y[0][0]: 
...  print y[0][0].split('x')[-1] 
5 
10 
+0

Спасибо Тим, это была отличная помощь/ – Hamed

+1

@ У вас уже есть 2 ответа, чтобы помочь с вашей проблемой. 15-минутная отметка прошла, поэтому вы можете принять любой, который вам нравится, если вы чувствуете, что ваша проблема решена (вам не обязательно, хотя). Также см. Http://stackoverflow.com/help/someone-answers –

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