Безопасное приведение строк к целым в списке кортежей

1

У меня есть список таких кортежей:

[('1001794', 'Us/Eastern', '2', '1', '3', '4', '5')
('1001832', 'Us/Central', '2', '3', '4', '4', '5')
('1001848', 'Us/Central', '2', '4', '5', '4', '5')
('1001855', 'Us/Central', '2', '1', '4', '4', '5')
('1001899', 'Us/Central', '2', '1', '4', '3', '5')
('1001914', 'Us/Pacific', '1', '4', '2', '4', '5')
('1001971', 'Us/Pacific', '3', '4', '2', '3', '5')
('1002021', 'Us/Eastern', '2', '1', '4', '4', '5')
('1002026', 'Us/Central', '2', '1', '4', '4', '2')
('1002028', 'Us/Eastern', '2', '1', '4', '4', '5')
('1002041', 'Us/Eastern', '2', '4', '3', '5', '4')]

И мне нужно преобразовать все числа там в числа. Я не против, если мне придется делать 6 различных пониманий списков, если это необходимо, но я все еще не могу обернуть голову вокруг достаточного понимания списков, чтобы составить его с нуля должным образом. Я пытался сделать:

[x = (int(x[0]),x[1],int(x[2]),int(x[3]),int(x[4]),int(x[5]),int(x[6])) for x in tlist]

Но он говорит мне, что это неверный синтаксис, и я не уверен, почему?

  • 2
    Потому что вы делаете назначение в списке понимания. Избавиться от x = .
  • 0
    и я предполагаю, что это не разрешено? Значит, понимание списка не является инструментом для этого? Я не просто хочу видеть их в этом формате, я хочу, чтобы список имел их в этом формате
Показать ещё 5 комментариев
Теги:
python-3.x
list-comprehension

4 ответа

4
Лучший ответ

Используйте str.isdigit:

[tuple(int(y) if y.isdigit() else y for y in x) for x in tup]
# [(1001794, 'Us/Eastern', 2, 1, 3, 4, 5), ...]

Это предполагает, что числа в ваших строках являются целыми числами. tup это ваша структура данных.


Для обработки отрицательных целых чисел используйте функцию, инкапсулирующую блок try-except exc (читайте о принципе EAFP):

def try_convert(s):
    try:
        return int(s)
    except ValueError:
        return s

[tuple(try_convert(y) for y in x) for x in tup]
# [(1001794, 'Us/Eastern', 2, 1, 3, 4, 5), ...]    

Для обработки int и float, вы можете использовать вложенный блок:

def try_convert(s):
    try:
        return int(s)
    except ValueError:
        try:
            return float(s)
        except ValueError:
            return s 
  • 2
    Мне нравится этот ответ. Спасибо за указание на полезность isdigit .
  • 1
    Неплохой подход, при условии, что все числовые строки выглядят как натуральные числа. «-2» останется строкой, например.
Показать ещё 4 комментария
2

Это сработало для меня:

y = [('1001794', 'Us/Eastern', '2', '1', '3', '4', '5'),
     ('1002041', 'Us/Eastern', '2', '4', '3', '5', '4')]
x = [(int(x[0]),x[1],int(x[2]),int(x[3]),int(x[4]),int(x[5]),int(x[6])) for x in y]
print(x)
[(1001794, 'Us/Eastern', 2, 1, 3, 4, 5), (1002041, 'Us/Eastern', 2, 4, 3, 5, 4)]

Вам просто нужно x = за пределами [.

  • 1
    Да, tlist = [(int(x[0]),x[1],int(x[2]),int(x[3]),int(x[4]),int(x[5]),int(x[6])) for x in tlist] работает для меня.
  • 1
    Это работает, но жестко кодирует все, включая положение строки, которую не следует преобразовывать.
2

Если вы знаете, где находятся ints, вы можете использовать Extended Iterable Unpacking чтобы упростить понимание списка, где вы пытаетесь использовать:

[(int(x), y, *map(int,v)) for x, y, *v in l]

[(1001794, 'Us/Eastern', 2, 1, 3, 4, 5),
 (1001832, 'Us/Central', 2, 3, 4, 4, 5),
 (1001848, 'Us/Central', 2, 4, 5, 4, 5),
 (1001855, 'Us/Central', 2, 1, 4, 4, 5),
 (1001899, 'Us/Central', 2, 1, 4, 3, 5),
 (1001914, 'Us/Pacific', 1, 4, 2, 4, 5),
 (1001971, 'Us/Pacific', 3, 4, 2, 3, 5),
 (1002021, 'Us/Eastern', 2, 1, 4, 4, 5),
 (1002026, 'Us/Central', 2, 1, 4, 4, 2),
 (1002028, 'Us/Eastern', 2, 1, 4, 4, 5),
 (1002041, 'Us/Eastern', 2, 4, 3, 5, 4)]
0

это ответ, который вы ищете?

list = []
newList = []

list = [
        ('1001794', 'Us/Eastern', '2', '1', '3', '4', '5'),
        ('1001832', 'Us/Central', '2', '3', '4', '4', '5'),
        ('1001848', 'Us/Central', '2', '4', '5', '4', '5'),
        ('1001855', 'Us/Central', '2', '1', '4', '4', '5'),
        ('1001899', 'Us/Central', '2', '1', '4', '3', '5'),
        ('1001914', 'Us/Pacific', '1', '4', '2', '4', '5'),
        ('1001971', 'Us/Pacific', '3', '4', '2', '3', '5'),
        ('1002021', 'Us/Eastern', '2', '1', '4', '4', '5'),
        ('1002026', 'Us/Central', '2', '1', '4', '4', '2'),
        ('1002028', 'Us/Eastern', '2', '1', '4', '4', '5'),
        ('1002041', 'Us/Eastern', '2', '4', '3', '5', '4')
        ]

newList = [[int(x[0]), x[1], int(x[2]), int(x[3]), int(x[4]), int(x[5]), int(x[6])] for x in list]

print(newList)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню