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

#python #tuples #rank

#python #кортежи #ранг

Вопрос:

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

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

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

      [(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]
  

Ответ №1:

 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)
  

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

Комментарии:

1. Что-то странное с этим. Используя LL = pprint.pprint([строка (i,) для i, строка в enumerate(LL,1)]). Чтобы продолжить обработку LL. И получите ошибки. LL должен оставаться в виде списка.

2. @user428862: Переопределить LL использование LL = [row (i,) for i,row in enumerate(LL,1)] .

Ответ №2:

Вы можете использовать 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)]
  

Ответ №3:

для i в диапазоне (len(LL)):
 RowId = i   1
 Заполняем[i].добавляем(RowId) 

Пожалуйста, протестируйте это.

Комментарии:

1. ооо. вы не можете добавлять элементы в кортеж после того, как они созданы 🙂 Почему бы вам не использовать список вместо этого?