Распаковка кортежей в списке списков с определенным порядком

1

У меня длинный список списков. Первый элемент в каждом списке - это кортеж с четырьмя строками. В некоторых списках есть второй элемент, который является строкой:

list_one = [('string1', 'number', 'Longstring1', 'long_string2'), 'long_string3']
list_two = [('string5', 'number1', 'Longstring4', 'long_string5')]  

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

new_list_one = [number, 'string1', 'Longstring1', 'long_string2', 'long_string3']
new_list_two = [number, 'string5', 'Longstring4', 'long_string5']  

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

Теги:
list
python-3.x
tuples

2 ответа

2
Лучший ответ
list_one = [('string1', '100', 'Longstring1', 'long_string2'), 'long_string3']
list_two = [('string5', '200', 'Longstring4', 'long_string5')] 

Вы можете распаковать кортеж, переключить первый и второй элементы и попытаться преобразовать в и int

def int_if_possible(val):
    try:
        return int(val)
    except ValueError:
        return val

def unpack(l):
    ret = [*l[0], *l[1:]]
    ret[0], ret[1] = int_if_possible(ret[1]), ret[0]
    return ret

print(unpack(list_one))
# [100, 'string1', 'Longstring1', 'long_string2', 'long_string3']
print(unpack(list_two))
# [200, 'string5', 'Longstring4', 'long_string5']
  • 0
    Спасибо вам большое! Это именно то, что мне было нужно. Знаете ли вы страницу в Интернете, которая может помочь мне понять, как работают звездочки в распаковке ()? Я не знаком с обозначениями.
  • 0
    @JackReimer Вот один из PEP, который описывает унарный оператор * . Другое использование находится в определениях функций: def foo(**bar): print(bar) принимает любое количество аргументов bar и помещает их в кортеж. Таким образом, foo(1, 2, 3) выведет (1, 2, 3)
Показать ещё 1 комментарий
0

Как я понимаю из вашего объяснения:

  • второй элемент кортежа всегда является целым числом
  • кортеж всегда имеет 4 элемента
  • в списке есть несколько раз только один элемент

Если это фиксированные правила, вы можете быть ясными и простыми.

def trans(lst):
    ret = [int(lst[0][1]), lst[0][0], lst[0][2], lst[0][3]]
    if len(lst) == 2:
        ret.append(lst[1])
    return ret

Obs: оператор * не работает в списках в Python 2.7.

Ещё вопросы

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