Напечатать set () заполнить элемент генератором питона - PullRequest
2 голосов
/ 05 ноября 2010

У меня есть генератор:

foundUnique = set()
def unique_items(myList, index, clearFlag): 
    for item in myList:
        if clearFlag is True:
            foundUnique.clear()
            clearFlag = False
        if item[index] not in foundUnique:
            yield item
            foundUnique.add(item[index])

И я использую этот "unique_items", чтобы получить уникальный список:

senderDupSend = unique_items(ip, 4, True)

Теперь я хочу, чтобы мой набор был доступен (я могунапечатать его элемент или внести некоторые изменения в конкретный элемент .....) но когда я пишу:

for item in foundUnique:
    print item

Он ничего не печатает!

Но если я напишу:

for item in senderDupSend:
    print item
for item in foundUnique:
    print item

Печатает все найденные уникальные предметы.

Скажите, пожалуйста, что я сделал не так?Как я могу решить эту проблему?

1 Ответ

2 голосов
/ 05 ноября 2010

Проблема в том, что unique_items - это генератор, поэтому

senderDupSend = unique_items(ip, 4, True)

- это генератор, который необходимо повторить.Когда вы запускаете

for item in foundUnique:
    print item

, генератор на самом деле еще не работал, поэтому foundUnique все еще пуст.

Когда вы позже продолжите делать

for item in senderDupSend: # This is what actually fills the list.
    print item
for item in foundUnique:
    print item

Itследует распечатать набор дважды: один раз во время его создания и один раз после его создания.


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

found_unique = set(item[index] for item in sequence)

В конкретном случае, который вы показываете, это будет:

found_unique = set(item[4] for item in ip)

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

found_unique.union(item[4] for item in other_ip_list) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...