python: преобразовать «5,4,2,4,1,0» в , , ]

Есть ли «простой» способ преобразования строки, содержащей числа, в список [x, y] ints?

# from: '5,4,2,4,1,0,3,0,5,1,3,3,14,32,3,5' # to: [[5, 4], [2, 4], [1, 0], [3, 0], [5, 1], [3, 3], [14, 32], [3, 5]] 

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

 num_str = '5,4,2,4,1,0,3,0,5,1,3,3,14,32,3,5' numpairs_lst = [] # ends up as [[5, 4], [2, 4], [1, 0], ...] current_num_str = '' # the current num within the str; stop when a comma is found xy_pair = [] # this is one of the [x,y] pairs -> [5, 4] for ix,c in enumerate(num_str): if c == ',': xy_pair.append(int(current_num_str)) current_num_str = '' if len(xy_pair) == 2: numpairs_lst.append(xy_pair) xy_pair = [] else: current_num_str += c # and, take care of last number... xy_pair.append(int(current_num_str)) numpairs_lst.append(xy_pair) 

11 Solutions collect form web for “python: преобразовать «5,4,2,4,1,0» в , , ]”

В Python есть две важные одноименные идиомы, которые помогают сделать это «простым».

В первой идиоме используйте zip () . Из документов Python:

Гарантируется порядок повторения итераций слева направо. Это делает возможной идиому для кластеризации ряда данных в n-длинные группы с использованием zip (* [iter (s)] * n).

Поэтому применительно к вашему примеру:

 >>> num_str = '5,4,2,4,1,0,3,0,5,1,3,3,14,32,3,5' >>> zip(*[iter(num_str.split(","))]*2) [('5', '4'), ('2', '4'), ('1', '0'), ('3', '0'), ('5', '1'), ('3', '3'), ('14', '32'), ('3', '5')] 

Это создает кортежи, каждая из которых имеет длину 2.

Если вы хотите, чтобы длина подэлементов была различной:

 >>> zip(*[iter(num_str.split(","))]*4) [('5', '4', '2', '4'), ('1', '0', '3', '0'), ('5', '1', '3', '3'), ('14', '32', '3', '5')] 

Вторая идиома – это список понятий . Если вы хотите, чтобы подэлементы были списками, оберните их пониманием:

 >>> [list(t) for t in zip(*[iter(num_str.split(","))]*4)] [['5', '4', '2', '4'], ['1', '0', '3', '0'], ['5', '1', '3', '3'], ['14', '32', '3', '5']] >>> [list(t) for t in zip(*[iter(num_str.split(","))]*2)] [['5', '4'], ['2', '4'], ['1', '0'], ['3', '0'], ['5', '1'], ['3', '3'], ['14', '32'], ['3', '5']] 

Любые группы элементов, которые не являются полными, будут усечены zip (). Например, если ваша строка не кратна 2, вы потеряете последний элемент.

Если вы хотите вернуть num_str , которые не являются полными (т. num_str Если ваш num_str не является кратным длине подэлемента), используйте num_str среза :

 >>> l=num_str.split(',') >>> [l[i:i+2] for i in range(0,len(l),2)] [['5', '4'], ['2', '4'], ['1', '0'], ['3', '0'], ['5', '1'], ['3', '3'], ['14', '32'], ['3', '5']] >>> [l[i:i+7] for i in range(0,len(l),7)] [['5', '4', '2', '4', '1', '0', '3'], ['0', '5', '1', '3', '3', '14', '32'], ['3', '5']] 

Если вы хотите, чтобы каждый элемент был int, вы можете применить это до других преобразований, обсуждаемых здесь:

 >>> nums=[int(x) for x in num_str.split(",")] >>> zip(*[iter(nums)]*2) # etc etc etc 

Как отмечалось в комментариях, с Python 2.4+ вы также можете заменить понимание списка выражением Generator , заменив [ ] на ( ) следующим образом:

  >>> nums=(int(x) for x in num_str.split(",")) >>> zip(nums,nums) [(5, 4), (2, 4), (1, 0), (3, 0), (5, 1), (3, 3), (14, 32), (3, 5)] # or map(list,zip(nums,nums)) for the list of lists version... 

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

Один из вариантов:

 >>> num_str = '5,4,2,4,1,0,3,0,5,1,3,3,4,3,3,5' >>> l = num_str.split(',') >>> zip(l[::2], l[1::2]) [('5', '4'), ('2', '4'), ('1', '0'), ('3', '0'), ('5', '1'), ('3', '3'), ('4', '3'), ('3', '5')] 

Ссылка : str.split() , zip() , Общая информация о типах последовательностей и разрезе

Если вы действительно хотите целые числа, вы можете сначала преобразовать список в целые числа, используя map :

 >>> l = map(int, num_str.split(',')) 

Объяснение:

split создает список отдельных элементов. Трюк – это нарезка: синтаксисом является list[start:end:step] . l[::2] будет возвращать каждый второй элемент, начиная с первого (так, первый, третий, …), тогда как второй срез l[1::2] возвращает каждый второй элемент из второго (так что второй, четвертый, …).

Обновление. Если вам действительно нужны списки, вы можете снова использовать map в списке результатов:

 >>> xy_list = map(list, xy_list) 

Обратите внимание, что ответ @ Johnsyweb, вероятно, быстрее, поскольку, похоже, он не делает ненужных итераций. Но фактическая разница зависит, конечно, от размера списка.

 #!/usr/bin/env python from itertools import izip def pairwise(iterable): "s -> (s0,s1), (s2,s3), (s4, s5), ..." a = iter(iterable) return izip(a, a) s = '5,4,2,4,1,0,3,0,5,1,3,3,4,3,3,5' fields = s.split(',') print [[int(x), int(y)] for x,y in pairwise(fields)] 

Взято из ответа @ martineau на мой вопрос , который я нашел очень быстрым.

Вывод:

 [[5, 4], [2, 4], [1, 0], [3, 0], [5, 1], [3, 3], [4, 3], [3, 5]] 

Сначала используйте split чтобы составить список чисел (как и во всех других ответах).

 num_list = num_str.split(",") 

Затем преобразуем в целые числа:

 num_list = [int(i) for i in num_list] 

Затем используйте itertools groupby рецепту:

 from itertools import izip_longest def grouper(n, iterable, fillvalue=None): "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return izip_longest(fillvalue=fillvalue, *args) pair_list = grouper(2, num_list) 

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

 pair_list = grouper(2, [int(i) for i in num_str.split(",")] 
 >>> num_str = '5,4,2,4,1,0,3,0,5,1,3,3,4,3,3,5' >>> inums = iter([int(x) for x in num_str.split(',')]) >>> [[x, inums.next()] for x in inums] [[5, 4], [2, 4], [1, 0], [3, 0], [5, 1], [3, 3], [4, 3], [3, 5]] >>> 

EDIT: @drewk очистил это, чтобы обрабатывать списки четных или нечетных длин:

 >>> f = '5,4,2,4,1,0,3,0,5,1,3,3,14,32,3,5' >>> li = [int(n) for n in f.split(',')] >>> [li[i:i+2] for i in range(0, len(li), 2)] [[5, 4], [2, 4], [1, 0], [3, 0], [5, 1], [3, 3], [14, 32], [3, 5], [7]] 

Вы можете сократить первую часть (преобразование «1,2,3» в [1, 2, 3]) с помощью функции split:

 num_list = num_str.split(",") 

Может быть, есть более простой способ получить пары, но я бы сделал что-то вроде этого:

 xy_pairs = [] for i in range(0, len(num_list), 2): x = num_list[i] y = num_list[i + 1] xy_pairs.append([x, y]) 

Кроме того, поскольку это все списки определенной длины (2), вы, вероятно, должны использовать кортеж:

 xy_pairs.append((x, y)) 

Может быть интересно иметь генератор. Вот выражение генератора:

 import re ch = '5,4,2,4,1,0,3,0,5,1,3,3,14,32,3,5' genexp = ( map(int,ma.groups()) for ma in re.finditer('(\d+)\s*,\s*(\d+)',ch) ) 
 #declare the string of numbers str_nums = '5,4,2,4,1,0,3,0,5,1,3,3,14,32,3,5' #zip two lists: the even elements with the odd elements, casting the strings to integers zip([int(str_nums.split(',')[i]) for i in range(0,len(str_nums.split(',')),2)],[int(str_nums.split(',')[i]) for i in range(1,len(str_nums.split(',')),2)]) """ Of course you would want to clean this up with some intermediate variables, but one liners like this is why I love Python :) """ 

Это более обобщенная функция, которая работает для разных размеров блоков и при необходимости добавляет напоминание

 def breakup(mylist,chunks): mod = len(mylist) % chunks if mod == 0: ae = [] elif mod == 1: ae = mylist[-1:] else: ae = [tuple(mylist[-mod:])] return zip(*[iter(mylist)]*chunks) + ae num_str = '5,4,2,4,1,0,3,0,5,1,3,3,14,32,3,5' lst = map(int,num_str.split(',')) print breakup(lst,2) 

OUT: [(5, 4), (2, 4), (1, 0), (3, 0), (5, 1), (3, 3), (14, 32), (3, 5) ]

Может быть, это?

 a = "0,1,2,3,4,5,6,7,8,9".split(",") [[int(a.pop(0)), int(a.pop(0))] for x in range(len(a)/2)] 
  • Веб-сайт Python Console
  • Получить путь к выбранным файлам в проводнике Windows с помощью python
  • Почему в Python иногда из импорта PIL изображение выходит из строя и импортируется Image?
  • Загрузка файлов в Google Cloud Storage с помощью Google App Engine (Python)
  • Python sys.modules содержит модуль, который еще не импортирован
  • Как работает Python .join?
  • Какие интересные хаки можно сделать с помощью sys.settrace?
  • Выпуклая область корпуса в Python?
  • Python - лучший язык программирования в мире.