Usando Python para trapacear no Scrabble

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


[Esteartigofoipublicadopelaprimeiravezem[Thisarticlewasfirstpublishedon R – AriLamstein.com, e gentilmente contribuiu para os R-blogueiros]. (Você pode relatar um problema sobre o conteúdo desta página aqui)


Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.

A resolução do meu ano novo foi aprender Python. Depois de fazer alguns cursos on-line, fiquei confortável o suficiente com o idioma para enfrentar um pequeno projeto paralelo. Projetos paralelos são ótimos para aprender um idioma, porque permitem que você seja o proprietário de um projeto do início ao fim, além de resolver um problema que é de genuíno interesse para você. Enquanto eu estava interessado em ter um projeto paralelo em Python por um tempo, demorei um pouco para encontrar um projeto que me interessasse.

Isso tudo mudou durante os bloqueios do COVID-19. Para passar o tempo, minha mãe (professora aposentada de inglês) ficou obcecada com o Scrabble e insistiu em jogar jogo após jogo comigo. O problema é que eu odeio o jogo, e não sou bom nisso, e continuei perdendo. Eventualmente, percebi que seria direto escrever um programa em Python que analisasse minha pilha de cartas e listasse a palavra com a maior pontuação que eu poderia criar. Voila – meu primeiro projeto paralelo em Python nasceu!

Acabei de encerrar este projeto e decidi compartilhá-lo, pois poderia ajudar outras pessoas interessadas em Python. A maioria das pessoas lê o meu blog por causa do Choroplethr (meu conjunto de pacotes R para mapear conjuntos de dados abertos) ou dos meus vários treinamentos em R. No entanto, ao longo do tempo, aprendi que muitos dos meus leitores também estão interessados ​​em Python. Além disso, a maioria dos trabalhos relacionados a dados na indústria (em oposição à Academia) usa Python em vez de R.

Você pode ver o projeto “Scrabble Cheat” no github aqui. A função da tecla é get_all_words, que usa uma sequência que representa um conjunto de blocos. Ele retorna uma lista de tuplas que representam palavras válidas que você pode formar a partir dessas letras, juntamente com sua pontuação no Scrabble. A lista é ordenada para que a palavra com maior pontuação apareça primeiro:

> get_all_words('ilzsiwl')
[('zills', 16),
('swiz', 16),
('zill', 15),
('wiz', 15),
('liz', 13),
('isz', 12),
('zs', 11),
('wills', 10),
('swill', 10),
('willi', 10),
...
]

Esta publicação o ajudará a entender essa saída (ou seja, “o que é uma lista de tuplas e por que os dados estão estruturados dessa maneira?”) Mas, primeiro, é útil fazer uma comparação e contraste entre o Base R e o Python Builtins .

Um dos conceitos centrais em R é a distinção entre “Base R” e “Pacotes que você escolhe instalar”. O Base R, embora seja um pacote, não pode ser desinstalado e contém elementos principais de linguagem, como quadro de dados e vetor. “Base R” também se refere coloquialmente a “todos os pacotes que acompanham o R e estão disponíveis quando você o carrega”, como utilitários, gráficos e conjuntos de dados.

Leia Também  paleta: Centenas de paletas de cores em R

Uma das coisas mais confusas sobre o R é que as pessoas estão cada vez mais se afastando da Base R para bibliotecas de terceiros para tarefas rotineiras. Por exemplo, o pacote utils tem uma função read.csv para ler arquivos CSV. Mas o read_csv A função do pacote readr é realmente mais rápida e não converte automaticamente as strings em fatores, o que geralmente é desejável. Da mesma forma, o pacote gráfico possui um enredo função para criar gráficos, mas o ggplot A função no pacote ggplot2 é muito mais popular.

Essa divisão entre “funcionalidade que acompanha R” e “como as pessoas que sabem que realmente usam R” é intrinsecamente confusa. O equivalente do Python a “Base R” é chamado de “Built-ins”. (Você pode ver a lista completa dos Built-ins do Python aqui). Mas, diferentemente do R, parece que as pessoas geralmente estão felizes com os Built-ins do Python e não recriam essa funcionalidade em outros pacotes. De fato, ao conversar com meus amigos que ensinam Python, eles enfatizaram que o conhecimento em Python geralmente se resume à fluência com os Built-ins.

As principais estruturas de dados internas que usei neste projeto são dicionários, listas e tuplas.

Dicionários

Dicionários (geralmente chamados Dictos) defina um valor chave relação. Por exemplo, cada letra do Scrabble pode ser vista como uma chave e sua pontuação numérica pode ser vista como seu valor. Podemos armazenar essas informações em um Python Dict como este:

> letter_scores = {'a': 1,  'b': 4,  'c': 4, 'd': 2,
                 'e': 1,  'f': 4,  'g': 3, 'h': 3,
                 'i': 1,  'j': 10, 'k': 5, 'l': 2,
                 'm': 4,  'n': 2,  'o': 1, 'p': 4,
                 'q': 10, 'r': 1,  's': 1, 't': 1,
                 'u': 2,  'v': 5,  'w': 4, 'x': 8,
                 'y': 3,  'z': 10}

> letter_scores['a']
1
> letter_scores['z']
10

O próprio ditado é definido por chaves. Cada par de valores-chave no Dict é definido por dois pontos e cada elemento do dict é separado por vírgula.

A página Built-ins diz que Dicts são criados com a palavra-chave ditar. No entanto, eles também podem ser criados com o símbolo {}. Como regra geral, os programadores de Python preferem definir estruturas de dados com símbolos em vez de palavras-chave.

Leia Também  Identidades financeiras para os não-bancários do mundo adicionariam US $ 250 bilhões ao PIB global, de acordo com um novo estudo
cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

Observe que R realmente não possui uma estrutura de dados equivalente. Na resposta aceita para esta pergunta no Stack Overflow, as pessoas dizem que uma Lista com Nomes é o mais próxima possível. No entanto, ainda existem diferenças significativas entre as duas estruturas de dados:

  • Em um Python Dict, as chaves devem ser exclusivas. Em R, os nomes de lista não precisam ser exclusivos.
  • Em um Python Dict, cada chave pode ser de um tipo diferente (por exemplo, int ou string). Em R, todos os nomes de lista devem ser do mesmo tipo.

Listas

As listas são provavelmente o tipo mais comum em Python. Eles são semelhantes aos vetores em R, pois servem para armazenar vários elementos do mesmo tipo. No entanto, R impõe estritamente esse requisito, enquanto o Python não.

O Scrabble Cheat usa uma Lista para armazenar o conteúdo de um arquivo que contém um dicionário de palavras em inglês. Em seguida, iteramos nesta lista para ver quais palavras podem ser escritas com os blocos do usuário. Aqui está o código para ler no dicionário de um arquivo:

all_words = open('words_alpha.txt').read().split()
all_words
>>> ['a',
'aa',
'aaa',
'aah',
'aahed',
'aahing',
'aahs',
... ]

Aqui abrimos o arquivo com aberto e leia-o como uma string com ler. o Dividido A função quebra a sequência em uma lista de seqüências menores, usando um espaço em branco como delimitador. Esse tipo de encadeamento de funções é muito comum em Python.

Tuplas

Tuplas são usados ​​para armazenar dados que possuem vários componentes. Por exemplo, um local em um mapa tem dois componentes: longitude e latitude. Tuplas também são imutável, o que significa que você não pode alterar os valores deles após a criação.

Scrabble Cheat diz cada palavra que seus blocos podem fazer, juntamente com a pontuação Scrabble dessa palavra. Cada (palavra, pontuação) par é armazenado como uma tupla. Como cada conjunto de blocos normalmente pode formar várias palavras, o valor de retorno de get_all_words é realmente uma lista de tuplas:

get_all_words('ttsedue')
[('etudes', 8),
('dustee', 8),
('detest', 7),
('stude', 7),
('tested', 7),
('tutees', 7),
('suede', 7),
('etude', 7),
('duets', 7),
... ]

Além de serem criadas com parênteses, as Tuplas também podem ser criadas com o tupla palavra-chave

Muitos idiomas têm funcionalidade para criar uma nova lista como uma função de outra lista. Python fornece uma maneira de fazer isso que eu não encontrei antes. É chamado de Compreensão da lista e tem o seguinte modelo:

[ object_in_new_list
for element in old_list
if condition_is_met ]

O Scrabble Cheat usa uma Compreensão de lista para percorrer uma lista de palavras em inglês e extrair as palavras que podem ser escritas com os blocos do usuário. Se a palavra puder ser escrita, ela é inserida em uma tupla junto com sua pontuação. O código real é assim:

[(one_word, get_word_score(one_word))
for one_word in load_words()
if can_spell_word(one_word, tiles)]

(O código real é um pouco mais complexo e você pode vê-lo aqui.)

Leia Também  Aprendizado de máquina do Azure para profissionais de R com o R SDK

Embora eu não tenha encontrado Compreensões de Lista antes (e elas certamente não são um recurso no R), parece que elas apareceram em outras linguagens de programação no passado (consulte 1, 2).

Este foi um projeto divertido que ajudou a consolidar o conhecimento do livro que eu havia adquirido recentemente sobre Python. Isso me proporcionou uma experiência valiosa com os Built-ins do Python, e a redação ajudou-me a solidificar minha compreensão de algumas diferenças importantes entre R e Python.

Uma pequena confissão: o jogo que estou jogando com minha mãe é o Words with Friends (WWF) da Zynga, não o Scrabble da Hasbro. Considero que o WWF é uma imitação do Scrabble, e também é um pouco mais complicado de digitar, por isso apenas me refiro a ele como Scrabble neste post. Além disso, o dicionário que meu aplicativo usa é muito maior que o dicionário oficial da WWF, portanto, muitas das palavras que o aplicativo recomenda que você não possa usar.

Se este post acabar se tornando popular, eu posso fazer outro enquanto continuo aprendendo Python. (Atualmente, estou procurando um projeto paralelo que me proporcione alguma experiência com Pandas, Mathplotlib e / ou Seaborn).

Os melhores recursos que encontrei para aprender Python vieram dos meus amigos Reuven Lerner e Trey Hunner. Ambos são instrutores profissionais de Python que (a) se especializam em treinamentos corporativos ao vivo e (b) lançaram recentemente produtos de consumo para indivíduos. O curso introdutório de Python do Reuven foi especialmente útil para me atualizar rapidamente com o básico. O Python Morsels de Trey, que envia um problema por semana, foi útil para me forçar a continuar praticando Python toda semana. (Não estou sendo pago para recomendar esses cursos – estou simplesmente passando adiante que eles me ajudaram).

O post Usando Python para trapacear no Scrabble apareceu pela primeira vez em AriLamstein.com.



Se você chegou até aqui, por que não inscreva-se para atualizações do site? Escolha o seu sabor: o email, Twitter, RSS ou facebook …



cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br