Создать ранг кортежей в python

1

Как мне это сделать? начиная с этого образца

         Id,  Id2    CCC
        [  (A123 A120 '2011-03'), 
  LL=     (A133 A123 '2011-03'),
         ( D123 D120 '2011-04'),
          (D140 D123 '2011-04'),]

I.m, пытаясь получить это, добавив ранг к каждому кортежу.

     [(A123, A120 ,'2011-03',1), 
  LL=     (A133, A123, '2011-03',2),
         ( D123, D120, '2011-04',3),
          (D140, D123, '2011-04',4),]


    for i in range(len(LL)):
        RowId = i+1
        LL.append(RowId)   

Я получаю что-то вроде этого:

        [(A123, A120 ,'2011-03'), 
  LL=     (A133, A123, '2011-03),
         ( D123, D120, '2011-04),
          (D140, D123, '2011-04),1,2,3,4]
Теги:
tuples
rank

3 ответа

3
Лучший ответ
import pprint
LL= [ ('A123', 'A120', '2011-03'),
      ('A133', 'A123', '2011-03'),
      ('D123', 'D120', '2011-04'),
      ('D140', 'D123', '2011-04'),]
LL = [row+(i,) for i,row in enumerate(LL,1)]
pprint.pprint(LL)

дает

[('A123', 'A120', '2011-03', 1),
 ('A133', 'A123', '2011-03', 2),
 ('D123', 'D120', '2011-04', 3),
 ('D140', 'D123', '2011-04', 4)]

Вот несколько объяснений:

Начнем с LL, определенного следующим образом:

In [28]: LL
Out[28]: 
[('A123', 'A120', '2011-03'),
 ('A133', 'A123', '2011-03'),
 ('D123', 'D120', '2011-04'),
 ('D140', 'D123', '2011-04')]

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

In [30]: list(enumerate(LL))
Out[30]: 
[(0, ('A123', 'A120', '2011-03')),
 (1, ('A133', 'A123', '2011-03')),
 (2, ('D123', 'D120', '2011-04')),
 (3, ('D140', 'D123', '2011-04'))]

который близок к тому, что вы хотите, за исключением того, что "ранг" начинает отсчет с 0 и помещается перед строкой, а не в конце. Мы можем сказать enumerate начать подсчет с помощью 1, используя enumerate(LL,1), и мы можем поместить ранг в конец строки, используя понимание списка:

In [31]: [row+(i,) for i,row in enumerate(LL,1)]
Out[31]: 
[('A123', 'A120', '2011-03', 1),
 ('A133', 'A123', '2011-03', 2),
 ('D123', 'D120', '2011-04', 3),
 ('D140', 'D123', '2011-04', 4)]

В понимании списка row является кортежем типа ('A123', 'A120', '2011-03'), и row+(i,) - сумма кортежей:

In [32]: ('A123', 'A120', '2011-03')+(1,)
Out[32]: ('A123', 'A120', '2011-03', 1)

Так построена каждая строка понимания списка.

  • 0
    Что-то странное с этим. Используя LL = pprint.pprint ([row + (i,) для i, строка в перечислении (LL, 1)]). Для продолжения обработки ЛЛ. И получите ошибки. LL должен оставаться в списке типа.
  • 0
    @ user428862: Чтобы переопределить LL используйте LL = [row+(i,) for i,row in enumerate(LL,1)] .
Показать ещё 1 комментарий
1

Вы можете использовать enumerate для создания переменных ранга (добавлено 1 для начала с 1) и создать новый список новых кортежей, поскольку кортежи неизменяемы, поэтому мы создаем новые кортежи.

Пример, должен работать и в вашем списке:

In [1]: LL=[(1,2,3),(1,2,3)]

In [2]: [j+(i+1,) for i,j in enumerate(LL)]
Out[2]: [(1, 2, 3, 1), (1, 2, 3, 2)]
0
for i in range(len(LL)):
        RowId = i+1
        LL[i].append(RowId)  

Пожалуйста, проверьте его.

  • 0
    не работал thasnk
  • 0
    ооо. вы не можете добавлять элементы в кортеж после их создания :) Почему бы вам не использовать вместо этого список?

Ещё вопросы

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