Python - разделить список кортежей на подсписок - PullRequest
1 голос
/ 11 декабря 2019

У меня есть список кортежей, как показано ниже. Кортежи в списках динамически хранятся. Допустим, каждый кортеж может иметь 6 или 20 элементов. Этот счет является динамическим.

a = [('Index','col1','col2','col3','col4','col5'),('1','2','4','6','78','9'),('3','6','8','9','2','1')]

Я хочу разделить первые 3 элемента из каждого кортежа в списке в другой список (как показано ниже).

b = [('Index','col1','col2'),('1','2','4'),('3','6','8')]
c = [('col3','col4','col5'),('6','78','9'),('9','2','1')]

Пример 2:

tup=[(7,6,8,19,2,4,13,1,10,25,11,34),(1,2,3,4,5,6,7,8,9,10,11,12),(3,5,6,7,89,0,1,3,4,5,6,7)]

Вывод должен быть таким:

 [(7,6,8),(1,2,3)(3,5,6)]
 [(19,2,4),(4,5,6),(7,89,0)]
 [(13,1,10),(7,8,9),(1,3,4)]
 [(25,11,34),(10,11,12),(5,6,7)]

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

Ответы [ 4 ]

1 голос
/ 11 декабря 2019

Мое решение:

def split_by(tuples, size=3):
    lens = [len(t) for t in tuples]
    n = min(lens)
    cnt = 0
    while cnt < n:
        result = [t[cnt:cnt+size] for t in tuples]
        yield result
        cnt += size
0 голосов
/ 12 декабря 2019

Один вкладыш, который обрабатывает динамические списки и различные размеры.

def split_by(lst, size=3):
  return [[t[ind:ind+size] for t in a] for ind in range(0, min(map(len, a)), size)]

print(split_by(a))

Вывод

[   [('Index', 'col1', 'col2'), ('1', '2', '4'), ('3', '6', '8')],    
    [('col3', 'col4', 'col5'), ('6', '78', '9'), ('9', '2', '1')]]
0 голосов
/ 11 декабря 2019

Более гибкий способ, который работал бы, если размер данных изменяется

a = [('Index','col1','col2','col3','col4','col5'),('1','2','4','6','78','9'),('3','6','8','9','2','1')]
res = [[a[0][c:c+3], a[1][c:c+3], a[2][c:c+3]] for c in range(0,len(a[0]), 3)]
print(*res)
# [('Index', 'col1', 'col2'), ('1', '2', '4'), ('3', '6', '8')] [('col3', 'col4', 'col5'), ('6', '78', '9'), ('9', '2', '1')]

Решение 2: Принимая во внимание различные размеры кортежей, поэтому итерируйте только кратное 3 на основе самого короткого кортежа, как @Diego Palaciosупоминается;)

a = [('Index','col1','col2','col3','col4','col5','Extra'),('1','2','4','6','78','9', 'Extra'),('3','6','8','9','2','1')]
res = [[a[0][c:c+3], a[1][c:c+3], a[2][c:c+3]] for c in range(0,min(len(a[0]),len(a[1]),len(a[2]))//3*3, 3)]
print(*res)
0 голосов
/ 11 декабря 2019

Вы можете использовать понимание списка и нарезку индекса, чтобы выполнить работу:

if len(a[0]) > 3:
    b = [x[:3] for x in a]
    c = [x[3:] for x in a]

Возможно, это не самый быстрый код, но он очень ясный и простой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...