python: создание списка из списка возвращает меньше элементов - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть список файлов, которые я создаю:

files=[f for f in os.listdir(source) if f.endswith('.tif')]
print(len(files))
264

Этот список содержит 264 файла, т.е.

 ...,'NL-HnWFA_2244_157.tif', 'NL-HnWFA_2244_158-001.tif', 'NL-HnWFA_2244_158-002.tif', 'NL-HnWFA_2244_159.tif', ...

Из этого списка файлов я хочу вычестьИнвентаризация (часть «157»), выполнив:

inventories = []
for file in files:
  inventories.append(file.split('_')[2].split('-')[0].split('.')[0])
print(len(inventories))  
264

Тогда у меня в списке 264 предмета
Однако, если я выполню команду:

inventories = {fn.split('_')[2].split('-')[0].split('.')[0] for fn in files}
print(len(inventories))
263

Двойнойзначения были опущены и всего 263 элемента.

Почему двойные значения опущены во втором утверждении?
Могу ли я (как-то) получить двойные значения в первом операторе?

1 Ответ

0 голосов
/ 28 ноября 2018

Это потому, что set (как вы делаете {...}), всегда делает последовательность неповторяющейся.

Ничего не поделаешь.

Так что вам нужноиспользуйте понимание списка один.

Демонстрация:

>>> a=[1,2,3,3]
>>> set(a)
{1, 2, 3}
>>> {i for i in a}
{1, 2, 3}
>>> {*a}
{1, 2, 3}
>>> 

Как в этом документы :

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

...