2016-05-11 3 views
-1

Пример строки -Синтаксический строку, содержащую # в качестве разделителя

"{1#2#3,4#5#6,7#8#9,10#11#12}" 

Я хочу это как 2D массив/список. как -

[ 
    [1, 2, 3], 
    [4, 5, 6], 
    [7, 8, 9], 
    [10, 11, 12] 
] 

Что является наиболее элегантный способ сделать это в Python?

Я попытался разбить первый на основе ','. Затем я получаю список. для каждого элемента в лифте я разделил его на «#». Таким образом, я могу это сделать. Но я хочу чистый способ сделать это.

+2

Не я, но что вы пробовали? – Caramiriel

+3

Я думаю, что вас занижают, потому что вы не включили в сообщение, какие усилия вы сделали. – AKS

+0

Теперь, когда я добавил прилагаемые усилия, пожалуйста, воздержитесь от вопроса. – user3903448

ответ

5
>>> s="{1#2#3,4#5#6,7#8#9,10#11#12}" 
>>> list(map(lambda x:list(map(int, x.split('#'))), s.strip('{}').split(','))) 
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] 

Вот что происходит на каждом шагу:

>>> s 
'{1#2#3,4#5#6,7#8#9,10#11#12}' 
>>> s.strip('{}') 
'1#2#3,4#5#6,7#8#9,10#11#12' 
>>> s.strip('{}').split(',') 
['1#2#3', '4#5#6', '7#8#9', '10#11#12'] 
>>> list(map(lambda x:x.split('#'), s.strip('{}').split(','))) 
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['10', '11', '12']] 
+0

Я думаю, что я заменил бы ваш 's [1: -1]' 's.lstrip (" {"). Rstrip ("} ")', который более ясен и безопасен. –

+0

@ByteCommander yes point took – ritesht93

1
s = "{1#2#3,4#5#6,7#8#9,10#11#12}" 
print(list(map(str.split, s.strip("{}").replace("#"," ").split(","))) 
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['10', '11', '12']] 

или список компе и отливать в целое, если вы действительно хотите Интс:

print([list(map(int,_s.split("#"))) for _s in s.strip("{}").split(",")]) 
+0

Вопрос запрашивает список списка * int * s, но у вас есть строки там ... –

1

Менее шумные:

map(lambda x: map(int, x.split('#')), s.strip("{}").split(',')) 
0

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

[[int(x) for x in row.split("#")] for row in s.strip("{}").split(',')] 

Пример использования:

s = "{1#2#3,4#5#6,7#8#9,10#11#12}" 
l = [[int(x) for x in row.split("#")] for row in s.strip("{}").split(',')] 
print(l) 
# Output: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] 

немного короче альтернативы можно было бы объединить оба map и Пояснение к списку:

[list(map(int, row.split("#"))) for row in s.strip("{}").split(',')] 
1

использовать комбинацию re и numpy:

>>> import re 
>>> import numpy as np 
>>> s = "{1#2#3,4#5#6,7#8#9,10#11#12}" 
>>> digits = re.findall('\d+', s) 
>>> rows = s.count(',') + 1 
>>> np.array(digits, dtype=int).reshape(rows, len(digits)/rows) 
array([[ 1, 2, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 9], 
     [10, 11, 12]]) 
+0

Вы согласны с тем, что это настоящий перебор для этого простого случая, не так ли? –

+1

@ByteCommander Я думаю, что чрезмерное нарезка, расщепление и картирование для этой задачи - хрупкое и излишнее. – timgeb

0

Простой способ заключается в использовании список понимание:

[list(map(int, sub.split('#'))) for sub in s.strip('{}').split(',')] 
+0

Вопрос запрашивает список списков ints, но у вас есть строки там ... –

+0

Спасибо, я не обращал на это внимания, теперь он обновлен. –

0

Это один просто :)

Для

s="{1#2#3,4#5#6,7#8#9,10#11#12}"

[el.split('#') for el in s[1:-1].split(',')]

вы можете получить

[[ '1', '2', '3'], [ '4', '5', '6'], [ '7', '8', '9'], ['10', '11', '12']]

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