Как узнать, сколько раз последнее значение во внутреннем списке дублируется во вложенном списке Python?

Рассмотрим следующую программу на уровне API на уровне Windows:

#define NOMINMAX
#include <windows.h>

int main()
{
    MessageBox( 0, "Blah blah...", "My Windows app!", MB_SETFOREGROUND );
}

Теперь давайте построим ее с помощью GNU toolchain (т. е. g ++), никаких специальных опций. Здесь gnuc - это только пакетный файл, который я использую для этого. Он предоставляет только опции, чтобы сделать g ++ более стандартным:

C:\test> gnuc x.cpp

C:\test> objdump -x a.exe | findstr /i "^subsystem"
Subsystem               00000003        (Windows CUI)

C:\test> _

Это означает, что компоновщик по умолчанию создает исполняемую консольную подсистему. Значение подсистемы в заголовке файла сообщает Windows о том, какие службы требуется программе. В этом случае с консольной системой для программы требуется окно консоли.

Это также заставляет интерпретатор команд ждать завершения программы.

Теперь давайте построим его с помощью GUI подсистемой, которая просто означает, что программа не требует окна консоли:

C:\test> gnuc x.cpp -mwindows

C:\test> objdump -x a.exe | findstr /i "^subsystem"
Subsystem               00000002        (Windows GUI)

C:\test> _

Надеюсь, это пока нормально, хотя флаг -mwindows только полудокументирован.

Строя без этого полудокументированного флага, нужно было бы более конкретно рассказать компоновщику, какое значение подсистемы нужно, а некоторые библиотеки импорта Windows API будут в общем случае должны быть указаны явно:

C:\test> gnuc x.cpp -Wl,-subsystem,windows

C:\test> objdump -x a.exe | findstr /i "^subsystem"
Subsystem               00000002        (Windows GUI)

C:\test> _

Это сработало

Но как насчет инструментальной цепочки Microsoft, то есть Visual C ++?

Ну, создание исполняемого файла подсистемы консоли прекрасно работает:

C:\test> msvc x.cpp user32.lib
x.cpp

C:\test> dumpbin /headers x.exe | find /i "subsystem" | find /i "Windows"
               3 subsystem (Windows CUI)

C:\test> _

Однако с построением инструментальной цепочки Microsoft в качестве подсистемы GUI не работает по умолчанию:

C:\test> msvc x.cpp user32.lib /link /subsystem:windows
x.cpp
LIBCMT.lib(wincrt0.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartu
p
x.exe : fatal error LNK1120: 1 unresolved externals

C:\test> _

Технически это связано с тем, что компоновщик Microsoft не является стандартным ошибка для подсистемы GUI . По умолчанию, когда подсистемой является графический интерфейс, тогда компоновщик Microsoft использует точку входа в библиотеку времени выполнения, функцию, в которой запускается машинный код, называемый winMainCRTStartup, который вызывает нестандартный Microsoft WinMain вместо стандартного main.

Нет ничего страшного в том, чтобы исправить это.

Все, что вам нужно сделать, это сообщить компоновщику Microsoft, что точка входа для использования, а именно mainCRTStartup, которая вызывает стандартный main:

C:\test> msvc x.cpp user32.lib /link /subsystem:windows /entry:mainCRTStartup
x.cpp

C:\test> dumpbin /headers x.exe | find /i "subsystem" | find /i "Windows"
               2 subsystem (Windows GUI)

C:\test> _

Нет проблем, но очень утомительно. И так тайно и скрыто, что большинство программистов Windows, которые в основном используют только инструменты Microsoft, не стандартные по умолчанию, даже не знают об этом, и ошибочно полагают, что программа подсистемы Windows GUI & ldquo; must & rdquo; имеют нестандартный WinMain вместо стандартного main. Попутно с C ++ 0x у Microsoft возникнет проблема с этим, поскольку компилятор должен затем рекламировать, является ли он независимым или размещенным (при размещении он должен поддерживать стандарт main).

В любом случае, вот почему g ++ может жаловаться на WinMain: это глупая нестандартная функция запуска, которую инструменты Microsoft по умолчанию требуют для программ подсистемы GUI.

Но как вы можете см. выше, g ++ не имеет проблем со стандартным main даже для программы подсистемы GUI.

Так что может быть проблемой?

Ну, вы, вероятно, отсутствуют a main. И у вас, вероятно, нет (правильного) WinMain! И затем g ++ после поиска main (нет такого) и для нестандартного Microsoft WinMain (нет такого) сообщает, что последний отсутствует.

Тестирование с пустым источником:

C:\test> type nul >y.cpp

C:\test> gnuc y.cpp -mwindows
c:/program files/mingw/bin/../lib/gcc/mingw32/4.4.1/../../../libmingw32.a(main.o):main.c:(.text+0xd2): undefined referen
ce to `WinMain@16'
collect2: ld returned 1 exit status

C:\test> _
1
задан 賴韋安 11 March 2019 в 14:10
поделиться

3 ответа

Поскольку место дубликатов не имеет значения, проблема заключается просто в длине списка минус уникальные значения. Итак:

last_elements=[i[-1] for i in a]
num_duplicates=len(last_elements)-len(set(last_elements)
0
ответ дан anishtain4 11 March 2019 в 14:10
поделиться

Вы можете использовать collections.Counter для подсчета вхождений последних элементов:

from collections import Counter
last = Counter([i[-1] for i in a])
# Counter({7: 1, 9: 2, 12: 2})

И затем посчитать, сколько из них больше, чем 1:

sum(1 for k,v in last.items() if v>1)
# 2
0
ответ дан yatu 11 March 2019 в 14:10
поделиться

Создайте набор последних значений из списка, а затем посчитайте длину:

len(a) - len({x[-1] for x in a})
# 2
0
ответ дан Psidom 11 March 2019 в 14:10
поделиться
Другие вопросы по тегам:

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