Получить список кортежей (или списков), где списки с одинаковыми элементами сгруппированы?

после прочтения предыдущих примеров я придумал следующее:

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] и другие элементы в массив, дублировать более или менее, быть более креативными, чем я

-2
задан Szymon Maszke 18 March 2019 в 00:19
поделиться

2 ответа

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 и указывает группировать по значению словаря. Выходные данные этого затем передаются в функцию карты, которая захватывает первый элемент из каждой пары в группе, которая будет соответствующим ключом.

0
ответ дан aws_apprentice 18 March 2019 в 00:19
поделиться

Из того, что я могу сказать, вы хотите кортеж ключей, где каждое значение одинаково.

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
0
ответ дан aws_apprentice 18 March 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: