Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
78 / 73 / 19
Регистрация: 18.05.2021
Сообщений: 287

Неслучайное перемешивание списка по ключу

02.07.2023, 18:38. Показов 1581. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как перемешать список по ключу так, чтобы можно было гарантировать, что любой различный ключ (в пределах диапазона) будет давать различный список?
В принципе подойдут и готовые библиотеки, хотя интересней были бы ссылки/подробное объяснение как это сделать. Я не смог ничего нагуглить по этому вопросу.

П.С.
В идеале принцип должен быть достаточно простым, но хорошо работающим. Ключи будут допускаться в пределах 100!, поэтому нужен алгоритм, который бы гарантировал, что получаемые списки по различным ключам различны. Такие алгоритмы есть, в принципе?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.07.2023, 18:38
Ответы с готовыми решениями:

Перемешивание списка
Подскажите, почему такой код работает import random y = random.shuffle(y) print(y)

Перемешивание списка
Здравствуйте. Можно ли в ворде или блокноте сделать макрос, который работал бы так: я выделяю список на странице, нажимаю кнопку и...

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

21
 Аватар для s_t_r_a_j
526 / 179 / 58
Регистрация: 12.02.2023
Сообщений: 641
02.07.2023, 21:47
Цитата Сообщение от -_human_- Посмотреть сообщение
Как перемешать список по ключу так, чтобы можно было гарантировать, что любой различный ключ (в пределах диапазона) будет давать различный список?
поясните нормально
либо то что вы говорите ерунда, ибо , "ключ = значение" и нет смысла перемешивать их, иначе просто теряется смысл словаря собственно
1
78 / 73 / 19
Регистрация: 18.05.2021
Сообщений: 287
02.07.2023, 23:06  [ТС]
s_t_r_a_j, я спрашивал про списки, не про словари. Под ключом имелась в виду некое число, которое должна принимать на вход программа, возвращающая перемешенный список. На каждый ключ список должен перемешиваться по разному.
Условно, есть список [1, 2, 3].
На ключ 0 должно возвращаться [1, 2, 3], на ключ 1 [1, 3, 2], на ключ 2 [2, 1, 3], на ключ 3 [2, 3, 1] и т.д.
Это не должен быть словарь с готовыми ключами и списками, так как количество перестановок равно n!, что для 100 элементов слишком много, нужен именно некий алгоритм, который сможет перемешать список так, чтобы не повторяться с разными ключами.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
02.07.2023, 23:11
-_human_-, ну вызови random.shuffle() n раз, перемешивания будут разные

Цитата Сообщение от -_human_- Посмотреть сообщение
Условно, есть список [1, 2, 3].
На ключ 0 должно возвращаться [1, 2, 3], на ключ 1 [1, 3, 2], на ключ 2 [2, 1, 3], на ключ 3 [2, 3, 1] и т.д.
сдвигай вправо n раз
0
 Аватар для s_t_r_a_j
526 / 179 / 58
Регистрация: 12.02.2023
Сообщений: 641
02.07.2023, 23:18
Цитата Сообщение от Welemir1 Посмотреть сообщение
random.shuffle() n раз
зачем n раз. можно же тогда просто из списка составить сочетаниями(библиотеки же есть) все виды перестановок и просто вызвать randint
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
02.07.2023, 23:20
s_t_r_a_j, рендом отставить, перестановки не случаные должны быть
простого сдвига хватит
0
78 / 73 / 19
Регистрация: 18.05.2021
Сообщений: 287
02.07.2023, 23:25  [ТС]
s_t_r_a_j, составить все виды перестановок для списка из 100 элементов? Это будет 9332621544394415268169923885626670049071 5968264381621468592963895217599993229915 6089414639761565182862536979208272237582 51185210916864000000000000000000000000. Немного не подъёмное количество и по времени и по памяти.

Тут весь вопрос именно в алгоритме, который сожет составить n'ую перестановку, не делая всех перестановок. Типа зная принцип получения каждой следующей перестановки, сразу получать конечный результат, без промежуточных перестановок.

Добавлено через 1 минуту
Welemir1, просто перестановки не подойдут, нужен способ получать результат как бы после выполнения простых перестановок, но без выполнения их непосредственно, условно найти зависимость.
0
 Аватар для s_t_r_a_j
526 / 179 / 58
Регистрация: 12.02.2023
Сообщений: 641
02.07.2023, 23:36
что представляют из себя ваши списки, что то типа этого...
Python
1
2
3
4
from  random import randint
h = randint(0, 100)
g = [h,[randint(i,i+100) for i in range(100)]]
print(g)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
02.07.2023, 23:46
-_human_-, но мы знаем закономерность и можем получить не выполняя их непосредственно, если речь о простом сдвиге. Это можно представить как бесконечную последовательность элементов нашего списка (itertools.cycle) и мы для получения n-ной перестановки, чтобы не выполнять их несредственно просто берем слайс от этой последовательности от н-ного элемента на длину списка.
0
78 / 73 / 19
Регистрация: 18.05.2021
Сообщений: 287
03.07.2023, 00:56  [ТС]
Welemir1, там не просто сдвиги, а все возможные случаи размещения элементов в списке. В простейшем случае это будет перебор, условно последовательности 0 1 2 - 0 2 1 - 1 0 2 - 1 2 0 - 2 0 1 - 2 1 0, из порядка убывания перебор в порядке возрастания. Просто слайс не подойдёт.

Добавлено через 54 секунды
s_t_r_a_j, списком являются первые 100 простых чисел.
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
03.07.2023, 04:52
Цитата Сообщение от -_human_- Посмотреть сообщение
Условно, есть список [1, 2, 3].
На ключ 0 должно возвращаться [1, 2, 3], на ключ 1 [1, 3, 2], на ключ 2 [2, 1, 3], на ключ 3 [2, 3, 1] и т.д.
Функция nth_permutation из модуля more_itertools (в библиотеку заносится как more-itertools):

Python
1
2
3
from more_itertools import nth_permutation
print( nth_permutation([1,2,3], 3, index=5) )
# (3, 2, 1)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
03.07.2023, 05:26
-_human_-,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from math import factorial
 
def primes(k) :
    res = [2]
    d = 3
    while len(res) < k:
        for e in res:
            if d%e == 0:
                d += 1
                break
        else:
            res.append(d)
    return res
 
 
n = 100
pr = primes(n)
 
f1 = factorial(n)
key = 10**200 % f1
j = n
while f1 > key:
    f1 //= j 
    j -= 1
 
m = n-j-1
res = []
ind = list(range(m, n))
 
while key > 0:
    a, key = divmod(key, f1)
    res.append(ind.pop(a))
    f1 //= j 
    j -= 1
 
result = [pr[i] for i in list(range(m)) + res + ind]
print(result)
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
03.07.2023, 05:35
Gdez, так это вы перестановку с каким номером вывели?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
03.07.2023, 05:38
idealist, “key”-ую )
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
03.07.2023, 06:13
Цитата Сообщение от Gdez Посмотреть сообщение
“key”-ую )
Просто непонятно где она у вас задается в программе. Если, например, 5-ю нужно вывести?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
03.07.2023, 06:50
idealist, тогда
Python
1
key = 5
0
32 / 24 / 11
Регистрация: 03.06.2023
Сообщений: 56
03.07.2023, 11:44
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from itertools import permutations
from typing import NoReturn
 
 
class Combination:
 
    def __init__(self, data: list) -> None:
        self.p = permutations(data)
        self.checked = {}
 
    def get_combination(self, key: int) -> list | NoReturn:
        if key not in self.checked:
            try:
                self.checked[key] = list(next(self.p))
            except StopIteration:
                raise self.NoCombinationsLeft('Cannot find new unique combination for the given list') from None
        return self.checked[key]
 
    class NoCombinationsLeft(Exception):
 
        def __init__(self, exc_msg: str) -> None:
            super().__init__(exc_msg)
 
 
if __name__ == '__main__':
    cmb = Combination([1, 2, 3])
    while True:
        print(cmb.get_combination(int(input('key='))))
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
03.07.2023, 12:00
Python
1
2
3
4
5
6
7
8
9
10
11
key=2
random.seed(key)
f=[1,2,3,4,5,6]
g=f.copy()
random.shuffle(g)
print(g)
key=3
random.seed(key)
g=f.copy()
random.shuffle(g)
print(g)
Может это подойдет?

Добавлено через 5 минут
Собственно, одному и тому же ключу в seed будет соответствовать одно и тоже перемешивание.
1
32 / 24 / 11
Регистрация: 03.06.2023
Сообщений: 56
03.07.2023, 12:09
u235, попробуйте со списком [1, 2, 3]. С ключами 2 и 3 появляется коллизия
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
03.07.2023, 13:11
Doule_, да, на мелких списках так и будет. Но вы же говорили, что у вас 100 элементов в списке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.07.2023, 13:11
Помогаю со студенческими работами здесь

Перемешивание списка фамилий
Есть список участников забега, допустим 10 фамилий. мне надо, случайно определить кто выйдет на старт 1, кто вторым, и т.д. Т.е вводим...

Перемешивание массива (списка)
Мне нужно проигрывать допустим 10 мелодий, но мне нужно чтобы они были всегда в рандомном порядке, то есть допустим их номера в массиве ...

Перемешивание списка фамилий
Есть список участников забега, допустим 10 фамилий. мне надо, случайно определить кто выйдет на старт 1, кто вторым, и т.д. Т.е вводим...

Перемешивание списка фамилий
т.е у меня есть список участников забега, допустим 10 фамилий. мне надо, случайно определить кто выйдет на старт 1, кто вторым, и т.д. ...

Случайное перемешивание элементов списка
помогите с заданием не могу решить в классе список метод - Shuffle (случайное перемешивание элементов списка) Добавлено через 6...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru