2011-09-10 2 views
1

Я новичок в Python и имею список номеров. например 5,10,32,35,64,76,23,53....Доступ к сгруппированным элементам в массивах

и я сгруппировал их в четыре (5,10,32,35, 64,76,23,53 и т. Д.), Используя код от this post.

def group_iter(iterator, n=2, strict=False): 
    """ Transforms a sequence of values into a sequence of n-tuples. 
    e.g. [1, 2, 3, 4, ...] => [(1, 2), (3, 4), ...] (when n == 2) 
    If strict, then it will raise ValueError if there is a group of fewer 
    than n items at the end of the sequence. """ 
    accumulator = [] 
    for item in iterator: 
     accumulator.append(item) 
     if len(accumulator) == n: # tested as fast as separate counter 
      yield tuple(accumulator) 
      accumulator = [] # tested faster than accumulator[:] = [] 
      # and tested as fast as re-using one list object 
    if strict and len(accumulator) != 0: 
     raise ValueError("Leftover values") 

Как я могу получить доступ к отдельным массивам, чтобы я мог выполнять на них функции. Например, я хотел бы получить среднее значение для первых значений каждой группы (например, 5 and 64 в моих примерах).

ответ

2

Допустим, у вас есть следующий кортеж кортежей:

a=((5,10,32,35), (64,76,23,53)) 

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

for i in a: 
    print i[0] 

Чтобы вычислить среднее значение для первых значений:

elements=[i[0] for i in a] 

avg=sum(elements)/float(len(elements)) 
1

ОК, это yield В корте из четырех чисел каждый раз, когда он повторяется. Таким образом, преобразовать все это в списке:

L = list(group_iter(your_list, n=4)) 

Тогда вы будете иметь список кортежей:

>>> L 
[(5, 10, 32, 35), (64, 76, 23, 53), ...] 

Вы можете получить первый элемент в каждом кортеже так:

firsts = [tup[0] for tup in L] 

(есть и другие способы, конечно.)

1

Вы создали кортеж кортежей или список кортежей или список списков или набор списков или что-то еще ...

Доступ к любому элементу из у вложенного список непосредственно:

toplist[x][y] # yields the yth element of the xth nested list 

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

for list in lists: 
    print list[y] 
+0

Вы переопределяете 'list', который является стандартным именем класса. Не рекомендуется. –

+0

Да, обычно я избегаю этого, но подсветка синтаксиса python помогает в примерах. – inlinestyle

1

Может быть избыточен для вашего приложения, но вы должны проверить мою библиотеку, панда. Такие вещи, как это довольно просто с функциональностью GroupBy:

http://pandas.sourceforge.net/groupby.html

, чтобы сделать 4-в-времени, что вам нужно будет вычислить массив bucketing:

import numpy as np 
bucket_size = 4 
n = len(your_list) 
buckets = np.arange(n) // bucket_size 

Тогда это, как simple as:

data.groupby(buckets).mean() 
Смежные вопросы