Форум сайта python.su
В документации описано, что 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)
>>>
Офлайн
Альтернатива:
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))
Офлайн
Я бы в виде альтернативы как то так написал, имхо:
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)
Офлайн
Спасибо.
Скажите пожалуйста, существуют ли какие то встроенные функции для сравнения значения ключей?
Я не нашел такой функции, поэтому решил, что для моей задачи лучше использовать кортеж с вложенными массивами. Но, не могу обратится к членам извлеченных из кортежа массивов, поскольку сами массивы входящие в кортеж, очевидно считаются одним элементом кортежа.
Поскольку
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]
Отредактировано rudm (Ноя. 24, 2012 14:53:40)
Офлайн
В документации описано, что 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)
smoke8531. Импорт в функции - плохо. Зачем дергать его каждый раз? Да и по PEP импорт должен быть в начале модуля.
Я бы в виде альтернативы как то так написал, имхо:
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)
Офлайн
кажите пожалуйста, существуют ли какие то встроенные функции для сравнения значения ключей?Это то что вам нужно?
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
Офлайн
Но, не могу обратится к членам извлеченных из кортежа массивов, поскольку сами массивы входящие в кортеж, очевидно считаются одним элементом кортежа.
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
Офлайн
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 по поведению.
Офлайн
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()
Офлайн
smoke853
Я подумал что цикл for здесь будет кстати, следовательно функцию которую я выше привел, похожа на метод 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)
Офлайн