Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 23, 2012 17:51:11

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.6.3 Не могу получить случайные значения из словаря с помощью метода popitem()

В документации описано, что popitem()
выводит в случайном порядке пару ключ: значение
Но у меня, почему то

import random

#создаю словарь
some_dict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}

#выбираю какие-нибудь случайные значения c помощью метода popitem()
#который выбирает из словаря пару 'ключ':значение в случайном порядке
print some_dict.popitem()
print some_dict.popitem()
выводит
 
****************************************************************
Personal firewall software may warn about the connection IDLE
makes to its subprocess using this computer's internal loopback
interface. This connection is not visible on any external
interface and no data is sent to or received from the Internet.
****************************************************************

IDLE 1.1.4 ==== No Subprocess ====
>>>
('a', 1)
('c', 3)
>>>
('a', 1)
('c', 3)
>>>
('a', 1)
('c', 3)
>>>
('a', 1)
('c', 3)
>>>
('a', 1)
('c', 3)
>>>
('a', 1)
('c', 3)
>>>
('a', 1)
('c', 3)
>>>
('a', 1)
('c', 3)
>>>
('a', 1)
('c', 3)
>>>
('a', 1)
('c', 3)
>>>



Офлайн

#2 Ноя. 23, 2012 21:58:14

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Python 2.6.3 Не могу получить случайные значения из словаря с помощью метода popitem()

Альтернатива:

import random
#создаю словарь
some_dict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
while some_dict:
    key = random.choice(some_dict.keys())
    print (key, some_dict.pop(key))



Офлайн

#3 Ноя. 24, 2012 00:01:12

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

Python 2.6.3 Не могу получить случайные значения из словаря с помощью метода popitem()

Я бы в виде альтернативы как то так написал, имхо:

def PopItem(mydict):
    import random
    for i in mydict:
        key = random.choice(mydict.keys())
    return key, mydict.pop(key)

Ну а потом:
some_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
print PopItem(some_dict)

Офлайн

#4 Ноя. 24, 2012 14:41:31

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.6.3 Не могу получить случайные значения из словаря с помощью метода popitem()

Спасибо.
Скажите пожалуйста, существуют ли какие то встроенные функции для сравнения значения ключей?
Я не нашел такой функции, поэтому решил, что для моей задачи лучше использовать кортеж с вложенными массивами. Но, не могу обратится к членам извлеченных из кортежа массивов, поскольку сами массивы входящие в кортеж, очевидно считаются одним элементом кортежа.
Поскольку

import random
some_tuple = (['a',1], ['b',2], ['c',3], ['d',4], ['e',5], ['f',6])
value_one = random.sample(some_tuple, 1)
value_one = random.sample(some_tuple, 1)
print value_one, value_two
выводит
[('f', 6)] [('c', 3)]

А попытка обратится к члену массива, по индексу, как обычно обращаются к членам массивов
print value_one[1]
Выводит понятную ошибку list index out of range

Поэтому, скажите пожалуйста - существует ли какой то способ, превратить извлеченный из кортежа массив, в полноценный, так, что бы к его членам можно было обратится по индексам?



Отредактировано rudm (Ноя. 24, 2012 14:53:40)

Офлайн

#5 Ноя. 24, 2012 15:09:00

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

Python 2.6.3 Не могу получить случайные значения из словаря с помощью метода popitem()

В документации описано, что popitem()
выводит в случайном порядке пару ключ: значение
popitem() выталкивает очередной элемент из словаря. Ну а т.к. элементы в словаре хранятся в проивольном порядке, то и элемент выталкивается проивольный. Порядок хранения эл-ов может быть другим на другой версии интерпретатора. У меня на версии 3.3 ваш код выводит:
In [7]: some_dict.popitem()
Out[7]: ('c', 3)
In [8]: some_dict.popitem()
Out[8]: ('b', 2)
In [9]: some_dict.popitem()
Out[9]: ('a', 1)


smoke853
Я бы в виде альтернативы как то так написал, имхо:
def PopItem(mydict):
import random
for i in mydict:
key = random.choice(mydict.keys())
return key, mydict.pop(key)

Ну а потом:
some_dict = {'a': 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5, ‘f’: 6}
print PopItem(some_dict)
1. Импорт в функции - плохо. Зачем дергать его каждый раз? Да и по PEP импорт должен быть в начале модуля.
2. Зачем здесь цикл? о_О
3. Убрав лишнее, получим вариант 4kpt



Офлайн

#6 Ноя. 24, 2012 15:14:34

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

Python 2.6.3 Не могу получить случайные значения из словаря с помощью метода popitem()

кажите пожалуйста, существуют ли какие то встроенные функции для сравнения значения ключей?
Это то что вам нужно?
In [1]: d1 = {'a':1, 'b':2}
In [2]: d2 = {'a':7, 'b':9}
In [3]: d3 = {'a':4, 'b':5, 'c':12}
In [4]: d1.keys() == d2.keys()
Out[4]: True
In [5]: d1.keys() == d3.keys()
Out[5]: False




Офлайн

#7 Ноя. 24, 2012 15:25:35

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

Python 2.6.3 Не могу получить случайные значения из словаря с помощью метода popitem()

Но, не могу обратится к членам извлеченных из кортежа массивов, поскольку сами массивы входящие в кортеж, очевидно считаются одним элементом кортежа.
In [1]: import random
In [2]: some_tuple = (['a',1], ['b',2], ['c',3], ['d',4], ['e',5], ['f',6])
In [3]: value_one = random.sample(some_tuple, 1)
In [4]: value_one
# как видим random.sample() возвращает список из одного элемента
Out[4]: [['e', 5]]
In [5]: value_one[0]
Out[5]: ['e', 5]
In [6]: value_one[0][1]
Out[6]: 5
# вместо random.sample(list, 1) лучше использовать random.choice(list)
In [7]: value_two = random.choice(some_tuple)
In [8]: value_two
Out[8]: ['b', 2]
In [9]: value_two[1]
Out[9]: 2



Офлайн

#8 Ноя. 24, 2012 16:10:45

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

Python 2.6.3 Не могу получить случайные значения из словаря с помощью метода popitem()

GaiveR, про PEP знаю, ну решил сделать, чтобы модуль random был в локальной видимости имен.
А по поводу цикла, если использовать цикл while, как привел в примере 4kpt, то лично у меня выводит сразу все ключи/значения в python 2.7.3, а в 3.3.0 так вообще ошибку выдает.
http://savepic.ru/3287934.jpg

А с учетом того что popitem удаляет из словаря случайную пару key/value.
http://savepic.ru/3310449.jpg
Я подумал что цикл for здесь будет кстати, следовательно функцию которую я выше привел, похожа на метод popitem по поведению.

Офлайн

#9 Ноя. 24, 2012 16:52:58

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.6.3 Не могу получить случайные значения из словаря с помощью метода popitem()

GaiveR
Большое спасибо.
Получается, я неверно пытался обратится к массиву вложенному в кортеж.

P.S.
Я не придумал ничего лучше как конвертировать в строку, извлекать значение ключа, конвертировать обратно в число и сравнивать. )

import random
#Задаем массив содержащий кортежи первое значение которых это ключ как в словаре
#а второе значение это значение ключа
some_cortege = (['a',1], ['b',2], ['c',3], ['d',4], ['e',5], ['f',6])

value_one = random.sample(some_cortege, 1)
value_two = random.sample(some_cortege, 1)

print value_one
print value_two

#Переводим в строки, что бы получить индексы
making_string_one = repr(value_one)
making_string_two = repr(value_two)

#Теперь, то что получилось, переводим обратно в числовые значения
making_int_one = int(making_string_one[-3])
making_int_two = int(making_string_two[-3])

#Сравниваем
def compare_values():
if making_int_one > making_int_two: print 'value one bigger'
if making_int_one < making_int_two: print 'value two bigger'
if making_int_one == making_int_two: print 'values equial'
#Выводим
compare_values()



Офлайн

#10 Ноя. 24, 2012 17:07:21

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Python 2.6.3 Не могу получить случайные значения из словаря с помощью метода popitem()

smoke853
Я подумал что цикл for здесь будет кстати, следовательно функцию которую я выше привел, похожа на метод popitem по поведению.

Чем? Тем что при н-ном запуске Вашей функции можно получить одно и то-же значение.
Метод popitem удаляет из словаря пару ключ: значение, посему повторение одной и той же пары ключ: значение невозможно… Так что предложенный Вами листинг далек от метода popitem…

Кроме того, намек был та то, что без цикла все будет работать точно так же (да и зачем вызывать popitem в Вашем примере, для меня осталось загадкой? Вы же все равно данные вынимаете разово). Привожу листинг (допиленный), который работает как Ваш, но обладает меньшим количеством строк, без нарушений РЕР да и выполняется быстрее. Результат тот-же…

import random
def PopItem(mydict):
    key = random.choice(mydict.keys())
    return key, mydict[key]
some_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
print PopItem(some_dict)



Отредактировано 4kpt (Ноя. 24, 2012 17:19:22)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version