2012-07-02 4 views
1

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

line1 field1 field2 field3 field4 field5 
line2 field1 field2 field3 field4 field5 

и так далее .....

Я сделал линию номер в качестве ключа и tuple (field1, field2, field3, field4) в качестве соответствующего значения моего словаря. Теперь я хочу включить field5 в качестве значения в key (field1, field2, field3, field4). Это означает, что tuple (field1, field2, field3, field4) должен быть ключом и значением в одно и то же время. Возможна ли такая реализация в python?

+0

Я смущен. Вы хотите, чтобы вы группировали строки на 'field5' и имели словарь словарей (как в вашем названии), или строки этого файла уже уникальны, и вы просто хотите, чтобы' field5' являлся ключом вместо номера строки (как в «включить ... как значение в ключ»)? –

+0

Кортежи могут быть ключами, но вам нужны другие поля как часть ключа? Если поле 5 уникально, можете ли вы использовать его в качестве ключа? (Если вы использовали номера строк в качестве ключей, то не был бы список проще?) – cdarke

+0

Я делаю кортеж (поле1, поле2, поле3, поле4) как значение и номер строки в качестве ключа. В основном, что я делаю, если ключи line1 и line2 имеют одинаковые значения, я удаляю обе записи из словаря. В качестве новой реализации, перед удалением записей, я хочу принять значение значений поля 5, которые являются отметками времени. – newbie555

ответ

0

Если я правильно понимаю ваш вопрос, да. Но вы собираетесь тратить много места на большой набор.

dic  = {} 
tuple1 = ("field1","field2","field3","field4") 

dic["line1"] = tuple1 
dic[tuple1] = "field5" 

print dic["line1"] 
print dic[tuple1] 
+0

Я думаю, что здесь нужен двумерный словарь. – newbie555

+0

Нет, это не так. Он создает 2 пары ключ-значение. Первая из них {"line1": tuple1} Вторая - {tuple1: "Field5"}. Конечным результатом является то, что словарь имеет 2 ключа, каждый из которых индексирует соответствующие значения. – 8bitwide

+0

@rock luke Я все еще теряю для чего? Но, тем не менее, возникает вопрос, как реализовать словарь словарей? – 8bitwide

0

Это означает, кортеж (поле1, поле2, field3, Field4) должен быть ключ и значение в то же самое время. Возможна ли такая реализация в python?

Да. Там ничто не мешает вам делать так:

key = ("f1", "f2", "f3", "f4", "f5") 
value = ("f1", "f2", "f3", "f4", "f5") 
d = {key: value} 

Если я вас правильно понимаю, вы делаете что-то вроде этого до сих пор:

line_no = 1 
d = {} 
for line in open(FILE): 
    d[line_no] = line # line = ("f1", "f2", "f3", "f4") 
    line_no += 1 

..?

Если нет, то просьба уточнить, где я неправильно или опубликовать исходный код :)

EDIT:

Хорошо, спасибо за комментарий, я думаю, теперь я понимаю. Я хотел бы сделать это следующим образом:

d = {} 
for line in open(FILE): 
    d[line] = [] 
    d[line].append(f5) # line = ("f1", "f2", "f3", "f4"), f5 = timestamp 

Таким образом, вы будете использовать весь кортеж в качестве ключа и может вычитать метки времени (f5) из записей с одинаковыми f1, f2, f3, f4. Для меня это гораздо проще делать в SQL.

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

Позвольте мне думать о том, как бы вы suctract метки времени друг от друга ..

EDIT2:

Да, вы можете составить список первого элемента в паре: П = [р [ 0] для р в парах]], а затем отфильтровать любой с более чем 1 вхождением:

что-то вроде этого l2 = [л для л в е, если Len (л)> 1]

но это Безразлично» t кажется очень эффективным ..

+0

Есть небольшое исправление для вашего сообщения. До сих пор я делаю d = {LINENO: («f1», «f2», «f3», «f4»)}. Теперь, я хочу связать f5, так что, когда две строки имеют одинаковые («f1», «f2», «f3», «f4»), я хочу принять разницу в f5 этих двух строк. – newbie555

+0

yes, thats a right edit – newbie555

+0

@jensen Спасибо, но я хочу только номер строки в качестве ключа и кортежа («f1», «f2», «f3», «f4») в качестве значения. Таким образом, я основывал все свои 300 строк кода. Я не хочу это менять. Я хочу расширение этой реализации, вот и все. – newbie555

0

http://docs.python.org/library/functions.html?highlight=tuple#tuple

кортеж является непреложным тип последовательности, как описано в порядковых типов - ул, юникод, список, кортеж, ByteArray, буфер, xrange.Для других контейнеров см. Встроенные классы dict, list и set, а также модуль коллекций .

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

Помимо чередования неизменяемых вопросов, вопрос немного расплывчатый.

Вот способ добавления field5 в словарь.

a = {1:(f1,f2,f3,f4), 2:(f1,f2,f3,f4)} # this is our dictionary contains tuple 

for key, value in a.iteritems(): # iterate over dictionary 
    a[key] += (field5,) # comma is important, you can only concanate tuple with tuple. 


# or you can do 
a[linenumber] += (field5,) 
Смежные вопросы