после прочтения предыдущих примеров я придумал следующее:
protected static $nonce_length = 32;
public static function getNonce()
{
$chars = array();
for ($i = 0; $i < 10; $i++)
$chars = array_merge($chars, range(0, 9), range('A', 'Z'));
shuffle($chars);
$start = mt_rand(0, count($chars) - self::$nonce_length);
return substr(join('', $chars), $start, self::$nonce_length);
}
Я дублирую в 10 раз массив [0-9, AZ] и перемешиваю элементы, после того как я получу случайную начальную точку для substr (), чтобы быть более «креативным» :) вы можете добавить [az] и другие элементы в массив, дублировать более или менее, быть более креативными, чем я
from operator import itemgetter
from itertools import groupby
# create a new dictionary where the value is a hashed immutable set
d = {k: hash(frozenset(v)) for k, v in dict_.items()}
{'pv_0': -3779889356588604112,
'pv_1': 2564111202014126800,
'pv_2': 777379418226018803,
'pv_3': -3779889356588604112,
'pv_4': 8713515799959436501,
'pv_5': 8713515799959436501,
'pv_6': -3779889356588604112,
'pv_7': 777379418226018803,
'pv_8': 2564111202014126800,
'pv_9': -6160949303479789752}
first = itemgetter(0) # operator to grab first item of iterable
second = itemgetter(1) # operator to grab second item of iterable
[list(map(first, v)) for _, v in groupby(sorted(d.items(), key=second), key=second)]
[['pv_9'],
['pv_0', 'pv_3', 'pv_6'],
['pv_2', 'pv_7'],
['pv_1', 'pv_8'],
['pv_4', 'pv_5']]
Последнее понимание списка извлекает все пары ключ / значение из словаря и сортирует их по значению. Затем он передает это в функцию groupby
из itertools и указывает группировать по значению словаря. Выходные данные этого затем передаются в функцию карты, которая захватывает первый элемент из каждой пары в группе, которая будет соответствующим ключом.
Из того, что я могу сказать, вы хотите кортеж ключей, где каждое значение одинаково.
def get_matching_keys(data: dict) -> list:
# first, make everything a set
for key in data:
data [key] = set (data [key]) # makes order irrelevant
results = []
duplicates = []
for key, value in data.items():
if key in duplicates: continue # we already did this
result = [key]
duplicates.append (key)
for key2, value2 in data.items():
if key == key2: continue # skip the same key
else:
if value == value2:
result.append (key2)
duplicates.append (key2) # make sure we don't do it again
results.append (result)
return results