цикл, пока все элементы не были доступны N раз в Python - PullRequest
0 голосов
/ 17 июля 2010

У меня есть группа ведер, в каждом из которых есть определенное количество предметов. Я хочу сделать комбинации с одним предметом из каждого ведра. Цикл должен продолжать создавать различные комбинации, пока каждый элемент не участвует хотя бы в некотором определенном числе.

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

Ответы [ 4 ]

1 голос
/ 17 июля 2010

itertools.product - это один из способов (очень систематический) для создания "комбинаций", которые вы запрашиваете (не путайте с функцией .combinations, конечно) - или вы можете сделать ихслучайно с random.choose от каждого ведра;Я не знаю, какой из них для вас, так как я не знаю, какова ваша настоящая цель.

В любом случае, я бы отслеживал, сколько комбинаций в каждом предмете было с диктом (или одним диктом на ведро)., если может быть совпадение предметов среди ведер).Или вы можете использовать collection.Counter в Python 2.7, если это ваша версия.

В любом случае, одна возможность сделать то, что вы запрашиваете: момент достижения счетчика элемента N, удалите этот элемент из его корзины (или всех корзин, если есть перекрытие и вам нужна семантика) - за исключением того, что если это оставляет корзину пустой, восстановите содержимое корзины и отметьте эту корзину как «выполнено» (не нужно удалять элементы из готового сегмента), например, добавив индекс набора в набор.

Все готово, когда все сегменты выполнены (будь то случайным или систематическим образом).

Нужен код, чтобы объяснить это лучше?Затем укажите семантику перекрытия (если перекрытие возможно) и систематические или случайные требования, которые у вас есть.

0 голосов
/ 17 июля 2010

В ванильном Python это, кажется, делает свою работу:

buckets = [ [1,2,3],[4],[5,6],[7,8,9,0] ]

def combo(b, i = 0, pref = []):
  if len(b) > i:
    c = b[i]
    for v in c:
      combo(b, i + 1, pref + [v])
  else:
    print pref

combo(buckets)

Вывод:

[1, 4, 5, 7]
[1, 4, 5, 8]
[1, 4, 5, 9]
[1, 4, 5, 0]
[1, 4, 6, 7]
[1, 4, 6, 8]
[1, 4, 6, 9]
[1, 4, 6, 0]
[2, 4, 5, 7]
[2, 4, 5, 8]
[2, 4, 5, 9]
[2, 4, 5, 0]
[2, 4, 6, 7]
[2, 4, 6, 8]
[2, 4, 6, 9]
[2, 4, 6, 0]
[3, 4, 5, 7]
[3, 4, 5, 8]
[3, 4, 5, 9]
[3, 4, 5, 0]
[3, 4, 6, 7]
[3, 4, 6, 8]
[3, 4, 6, 9]
[3, 4, 6, 0]

Нет никаких сомнений в более Pythonic способ сделать это.

0 голосов
/ 17 июля 2010

Используйте словарь с элементами в качестве ключей.Каждый раз, когда элемент используется, обновляйте его количество.Затем проверьте, все ли значения превышают пороговое значение, например:

counter = dict()
while min(counter.values) < threshold:
   # make a combination
   # and update the dictionary
0 голосов
/ 17 июля 2010

попробуй

visits = defaultdict(int)

# do at each node visiting
    visits[n] += 1
    if visits[n] >= MAX_VISITS:
        break

print 'done'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...