Хранение и обновление списков в словарях Python: почему это происходит?

Вы не можете возвращать массивы из функций из C. Вы также не можете (не должны) делать это:

char *returnArray(char array []){
 char returned [10];
 //methods to pull values from array, interpret them, and then create new array
 return &(returned[0]); //is this correct?
} 

returned создается с автоматическим временем хранения и ссылками на него станет недействительным, когда он покинет область объявления, т. е. когда функция вернется.

Вам нужно будет динамически распределить память внутри функции или заполнить предварительно выделенный буфер, предоставленный вызывающим.

Вариант 1:

динамически выделяет память внутри функции (вызывающий абонент, ответственный за освобождение ret)

char *foo(int count) {
    char *ret = malloc(count);
    if(!ret)
        return NULL;

    for(int i = 0; i < count; ++i) 
        ret[i] = i;

    return ret;
}

Вызывает его так:

int main() {
    char *p = foo(10);
    if(p) {
        // do stuff with p
        free(p);
    }

    return 0;
}

Вариант 2:

заполнить предварительно выделенный буфер, предоставленный вызывающим абонентом (абонент выделяет buf и переходит к функции)

void foo(char *buf, int count) {
    for(int i = 0; i < count; ++i)
        buf[i] = i;
}

И назовите его так :

int main() {
    char arr[10] = {0};
    foo(arr, 10);
    // No need to deallocate because we allocated 
    // arr with automatic storage duration.
    // If we had dynamically allocated it
    // (i.e. malloc or some variant) then we 
    // would need to call free(arr)
}
27
задан Mike B 12 January 2009 в 15:37
поделиться

4 ответа

Давайте посмотрим

d[t].append(c)

, Каково значение [1 110]? Попробуйте его.

d = {}
t = 0
d[t]

, Что Вы получаете? О. Нет ничего в [1 111], который имеет ключ [1 112].

Теперь попытка это.

d[t] = []
d[t]

Ahh. Теперь существует что-то в [1 113] с ключом [1 114].

существует несколько вещей, которые можно сделать.

  1. пример Использования 2.
  2. Использование setdefault. d.setdefault(t,[]).append(c).
  3. Использование collections.defaultdict. Вы использовали бы defaultdict(list) вместо простого словаря, {}.
<час>

Редактирование 1. Оптимизация

Данный входные строки из файла в вышеупомянутой форме: ts, x, y, процесс группировки бесполезен. Нет никакой причины пойти из простого списка (ts, x, y) к более сложному списку (ts, (x, y), (x, y), (x, y)...). Исходный список может быть обработан точно, когда он прибыл.

d= collections.defaultdict(list)
for ts, x, y in someFileOrListOrQueryOrWhatever:
    d[ts].append( (x,y) )
<час>

Редактирование 2. Ответьте на Вопрос

"при инициализации словаря, необходимо ли сказать словарь, на что будет похожа структура данных в виде пар "ключ-значение"?"

я не уверен, что означает вопрос. С тех пор все словари структуры значения ключа, вопрос, не очень ясный. Так, я рассмотрю эти три альтернативы, которые могут ответить на вопрос.

Пример 2 .

Инициализация

d= {}

Использование

if t not in d:
    d[t] = list()
d[t].append( c )

Каждое значение словаря должно быть инициализировано к некоторой полезной структуре. В этом случае мы проверяем, чтобы видеть, присутствует ли ключ; когда ключ отсутствует, мы создаем ключ и присваиваем пустой список.

инициализация Setdefault

d= {}

Использование

d.setdefault(t,list()).append( c )

В этом случае, мы используем setdefault метод, чтобы или выбрать значение, связанное с ключом или создать новую стоимость, связанную с недостающим ключом.

инициализация dict

по умолчанию

import collections
d = collections.defaultdict(list)

Использование

d[t].append( c )

defaultdict использование инициализатор функционируют для недостающих ключей. В этом случае мы обеспечиваем эти list функция так, чтобы новый, пустой список был создан для недостающего ключа.

72
ответ дан S.Lott 14 October 2019 в 12:36
поделиться

Я думаю, что Вы хотите использовать setdefault. Это немного странно использовать, но делает точно, в чем Вы нуждаетесь.

d.setdefault(t, []).append(c)

.setdefault метод возвратит элемент (в нашем случае, списке), это связывается с ключом dict t, если тот ключ существует. Если это не сделает, это свяжет пустой список с ключом t и возвратит его. Так так или иначе список будет там, что .append метод может тогда добавить кортеж c к.

12
ответ дан Tim Pietzcker 14 October 2019 в 12:36
поделиться
dict=[]  //it's not a dict, it's a list, the dictionary is dict={}
elem=[1,2,3]
dict.append(elem)

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

print dict[0] // 0 is the index

вывод будет:

[1, 2, 3]
1
ответ дан Giancarlo 14 October 2019 в 12:36
поделиться

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

#!/usr/bin/env python
"""
$ cat data_shuffled.txt
0,2,7
1,4,7
0,4,7
1,9,0
1,2,5
0,6,7
1,6,8
0,9,5
"""
from itertools   import groupby
from operator    import itemgetter

# load the data and make sure it is sorted by the first column
sortby_key = itemgetter(0)
data = sorted((map(int, line.split(',')) for line in open('data_shuffled.txt')),
              key=sortby_key)

# group by the first column
grouped_data = []
for key, group in groupby(data, key=sortby_key):
    assert key == len(grouped_data) # assume the first column is 0,1, ...
    grouped_data.append([trio[1:] for trio in group])

# print the data
for i, pairs in enumerate(grouped_data):
    print i, pairs

Вывод:

0 [[2, 7], [4, 7], [6, 7], [9, 5]]
1 [[4, 7], [9, 0], [2, 5], [6, 8]]
1
ответ дан jfs 14 October 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: