Вы не можете возвращать массивы из функций из 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)
}
Давайте посмотрим
d[t].append(c)
, Каково значение [1 110]? Попробуйте его.
d = {}
t = 0
d[t]
, Что Вы получаете? О. Нет ничего в [1 111], который имеет ключ [1 112].
Теперь попытка это.
d[t] = []
d[t]
Ahh. Теперь существует что-то в [1 113] с ключом [1 114].
существует несколько вещей, которые можно сделать.
setdefault
. d.setdefault(t,[]).append(c)
. 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
функция так, чтобы новый, пустой список был создан для недостающего ключа.
Я думаю, что Вы хотите использовать setdefault. Это немного странно использовать, но делает точно, в чем Вы нуждаетесь.
d.setdefault(t, []).append(c)
.setdefault
метод возвратит элемент (в нашем случае, списке), это связывается с ключом dict t
, если тот ключ существует. Если это не сделает, это свяжет пустой список с ключом t
и возвратит его. Так так или иначе список будет там, что .append
метод может тогда добавить кортеж c
к.
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]
В случае Ваши данные уже не отсортированы по желаемым критериям, вот код, который мог бы помочь сгруппировать данные:
#!/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]]