Преобразовать список str-кортежей в список int-кортежей? - PullRequest
0 голосов
/ 05 января 2019

У меня есть список кортежей, которые я хотел бы импортировать в словарь. Эти кортежи состоят из двух строк. Я хотел бы преобразовать эти кортежи в целые числа. * 1001 то есть *

myList = ['0,1', '0,2', '0,3']

Полученный список должен быть:

resList = [(0,1), (0,2), (0,3)]

Я пытался использовать:

list(map(int, myList))

Но, похоже, это не сработает.

Ответы [ 5 ]

0 голосов
/ 05 января 2019

Это другой вариант:

myList = ['0,1', '0,2', '0,3']

def tSet(list): 
    return tuple([int(i) for i in list])

resList  = [tSet(i.split(",")) for i in myList]

print(resList) #Output: [(0, 1), (0, 2), (0, 3)]
0 голосов
/ 05 января 2019

str.partition может использоваться для этого.

>>> [(int(x), int(y)) for x, _, y in (z.partition(',') for z in myList)]
[(0, 1), (0, 2), (0, 3)]

Генераторное выражение (z.partition(',') for z in myList) производит вывод str.partition для каждого элемента списка, а затем мы вызываем int для необходимых нам частей.

0 голосов
/ 05 января 2019

Вы можете использовать функцию eval для получения кортежей, как это. Работает как в python2, так и в python3.

>>> myList = ['0,1', '0,2', '0,3']
>>> list(map(eval, myList))
[(0, 1), (0, 2), (0, 3)]
0 голосов
/ 05 января 2019

Альтернативным решением является использование ast.literal_eval (вместо eval, которое можно считать небезопасным):

>>> import ast
>>> ast.literal_eval('0,1')
(0, 1)

Итак, вы можете сделать:

>>> my_list = ['0,1', '0,2', '0,3']
>>> result = [ast.literal_eval(x) for x in my_list]
>>> result
[(0, 1), (0, 2), (0, 3)]
0 голосов
/ 05 января 2019

Вам также нужно разделить строки на ','.

>>> [tuple(map(int, s.split(','))) for s in myList]                                                                               
[(0, 1), (0, 2), (0, 3)]

Другой вариант - использовать модуль csv.

>>> import csv                                                                                                                    
>>> list(csv.reader(myList))                                                                                                      
[['0', '1'], ['0', '2'], ['0', '3']]
>>> [tuple(map(int, row)) for row in csv.reader(myList)]                                                                          
[(0, 1), (0, 2), (0, 3)]

Если не очень важно, что внутренние элементы результата являются кортежами и имеют тип int, мы можем упростить решение csv до

>>> list(csv.reader(myList, quoting=csv.QUOTE_NONNUMERIC))                                                                        
[[0.0, 1.0], [0.0, 2.0], [0.0, 3.0]]

~ ~ * редактировать 1016 *

ответ thelogicalkoan напомнил мне о ast.literal_eval, который обеспечивает здесь самое элегантное (и безопасное) решение.

>>> from ast import literal_eval                                                                                                  
>>> [literal_eval(x) for x in myList]                                                                                             
[(0, 1), (0, 2), (0, 3)]
...