#!/usr/bin/python3 """Cuales son los nombres y apellidos más comunes? La AFIP publica ``apellidoNombreDenominacion.zip`` con los nombres y apellidos de todos las CUITs válidas; contiene un archivo de texto con unos 6,3 millones de líneas así: 23304662999SAEZ MAXIMO ALEJANDRO NINIA NN08 23304663189PEREYRA EMILIO RAMON NINIA NN08 23304663294AVALO SANDRA NOEMI ALN 08 23304663359MAIDANA DANIEL OSMAR AVN 10 23304691689SANCHEZ CEBREIRO DIEGO NINIA NN08 23304692049TISSERA GRAFEUILLE FEDERICO LNINIG NN08 20005802890SUCESION DE VIVOT JUAN FRANCISACEXNINN00 Está codificado en Latin-1, habitualmente omitiendo tildes, y parece que los campos son así: 0123456789 123456789 123456789 123456789 123456789 20005802890SUCESION DE VIVOT JUAN FRANCISACEXNINN00 cccccccccccnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn0123456789 Es decir, los primeros 11 caracteres son la CUIT, los próximos 30 el nombre, y los siguientes algun tema de categorización que no me interesa. Con este programa nos enteramos que los apellidos y nombres más comunes son los siguientes: 74811 Gonzalez 65517 Rodriguez 57424 Fernandez 53199 Lopez 49773 Gomez 48330 Martinez 45878 Garcia 40394 Perez 39770 Diaz 36672 Sanchez 29110 Romero 24435 Alvarez 20884 Sosa 20596 Torres 20337 Ruiz 19235 Ramirez 17689 Benitez 17488 Flores 16291 Acosta 16009 Gutierrez 16007 Gimenez 15629 Suarez 15408 Medina 15177 Rojas 14988 Castro 14171 Aguirre 14164 Herrera 13793 Molina 13734 Pereyra 13250 Ortiz 12962 Nuñez 12819 Silva 133831 Alberto 98289 Daniel 96365 Beatriz 85159 Alejandro 78358 Maria 76568 Jose 70339 Alejandra 69446 Soledad 66552 Luis 64145 Javier 59528 Antonio 56991 Martin 56140 Carlos 55638 Gabriel 54621 Andres 53821 Eduardo 51613 Nicolas 50183 Ariel 49706 Ezequiel 47693 Noemi 46957 Belen 45201 Angel 44113 Oscar 43297 Elizabeth 41656 Andrea 41538 Manuel 40221 Sebastian 37615 Fabian 34050 Ines 33932 Pablo 33697 Marcelo 32912 Carmen Entonces, según la falacia Mohammed Wang, los nombres más argentinos serían Daniel Alberto Rodríguez González y María Beatriz Rodríguez González. De hecho existen tres Daniel Rodríguez González o Daniel González Rodríguez en el archivo: 20367892251GONZALEZ RODRIGUEZ ALAN DANIELNIACNINN00 20630267596GONZALEZ RODRIGUEZ DANIEL ALEXNINIA NN08 20944809822RODRIGUEZ GONZALEZ DANIEL ALEJNINIA NN08 Y bocha de María González Rodríguez y María Rodríguez González. Total, nada de Beatriz Rodríguez González o Alberto Rodríguez González. Si nos restringimos a los Albertos (con ``grep -i alberto``) tenemos: 1989 Gonzalez 1772 Rodriguez 1522 Lopez 1514 Fernandez 1415 Gomez 1323 Martinez 1287 Garcia 1166 Perez 1149 Diaz ... 131162 Alberto 1142 Jose 1116 Adalberto 1039 Daniel 736 Oscar 700 Luis 687 Martin 676 Antonio 574 Ramon Es interesante notar que entre los Albertos el apellido Lopez es más común que Fernández. (Y por supuesto los nombres Beatriz, María, y Soledad son menos comunes.) """ import io, sys, collections def names(charstream): for line in charstream: yield line[11:41].title() def people(names): for name in names: # Probablemente uno de los campos que desconozco sería una # mejor forma de hacer esto: for stopword in ['srl', 's.a.', 's.r.l.', 'condominio', 'sucesion', 'asociacion', 'consorcio', 'fundacion', 'sociedad', 's.a', 'anonima', 'club']: if stopword in name.lower(): break else: yield name def tabulate(names): surnames = collections.Counter() givens = collections.Counter() for name in names: words = name.split() # Palabras en el medio pueden ser o nombres o apellidos. # Además palabras de una letra pueden ser abreviaciones o # partes de apellidos como “D’Elia”. “De” and “Di” también # son comunes. surname = words[0] if surname in ['D', 'De', 'Di']: surname += ' ' + words[1] if words[1] in ['Los', 'Las']: surname += ' ' + words[2] surnames[surname] += 1 if len(words[-1]) > 1: givens[words[-1]] += 1 return surnames, givens if __name__ == '__main__': # fuck you very much Python3 # https://stackoverflow.com/questions/16549332/python-3-how-to-specify-stdin-encoding # apparently sys.stdin.reconfigure(encoding='utf-8') also works in 3.7+ charstream = io.TextIOWrapper(sys.stdin.buffer, encoding='iso-8859-1') surnames, givens = tabulate(people(names(charstream))) for surname, freq in surnames.most_common(32): print('%8d %s' % (freq, surname)) print() for given, freq in givens.most_common(32): print('%8d %s' % (freq, given))