Панграммы CodeEval вызов


Я принял вызов на CodeEval. Хотя код, кажется, работает для примеров взяты с сайта, я чувствую, что это не очень красиво и должно быть более сложным, чем он должен быть.

Описание:

Предложение 'быстрая коричневая лиса прыгает через ленивую собаку' содержит каждая буква в алфавите. Такие предложения называются панграммы. Вы должны написать программу, которая принимает приговор, и возвращает все буквы в нем отсутствуют (который мешает ей быть панграмма). Вы должны игнорировать регистр букв в предложении и ваше возвращение должно быть все строчные буквы в алфавитном порядке. Вы также должны игнорировать всех нас-ASCII символы.В случае ввода приговор уже панграммой, распечатать строковое значение null.

import sys
filepath = sys.argv[1]
f = open(filepath)
wholealphabet = ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r',
                 's','t','u','v','w','x','y','z')
for line in f:
    sortedletters = list(set(line.lower()))
    i = 0
    while i != len(sortedletters):
        if wholealphabet.count(sortedletters[i]) != 0: 
            i = i + 1
        else:
            sortedletters.pop(i)
    missingletters = ""
    for letter in wholealphabet:
        if sortedletters.count(letter) == 0:
            missingletters +=letter
    if len(missingletters) == 0:
        print("NULL")
    else:
        print(missingletters)


1351
8
задан 27 ноября 2011 в 02:11 Источник Поделиться
Комментарии
2 ответа

Одна из наиболее сильных сторон языка Python является его встроенные возможности использовать наборы напрямую. Я не чувствую, что вы использовали наборы в полной мере здесь. Я бы также хотел отметить с заявлением, в котором вы должны, вероятно, использовать для обработки дескрипторов файлов.

from __future__ import with_statement
import sys
from string import ascii_lowercase
filepath = sys.argv[1]
wholealphabet = frozenset(ascii_lowercase)

# Use with to handle file … handles
with open(filepath) as f:
for line in f: # assume a line is a sentence, not exactly per spec?
# sortedletters = list(set(line.lower())) # guaranteed to be *unsorted*
missingletters = wholealphabet.difference(line.lower())
if missingletters:
print ''.join(sorted(missingletters))
else:
print 'NULL'

Это действительно все, что вам нужно. Если вы хотите пересмотреть определение приговора. :)

12
ответ дан 27 ноября 2011 в 04:11 Источник Поделиться

import sys
filepath = sys.argv[1]
f = open(filepath)

Я рекомендую не использовать одну букву имена переменных (как правило). Они делают код трудно читать.

wholealphabet = ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r',
's','t','u','v','w','x','y','z')

Я бы сделал эту строку

wholealphabet = "abcdefghijklmnopqrstuvwxyz"

Короче и работает почти так же

for line in f:
sortedletters = list(set(line.lower()))

Да, это не отсортированный.

    i = 0
while i != len(sortedletters):
if wholealphabet.count(sortedletters[i]) != 0:

Это так же, как sortedletters[я] в wholealphabet, который яснее.

            i = i + 1
else:
sortedletters.pop(i)

Изменения списка во время итерации по нему обязан быть запутанным. Его трудно увидеть, что вы делаете здесь. Лучший способ в Python, как правило, чтобы создать новый список. Как это:

valid_letters = []
for letter in sortedletters:
if letter in wholealphabet:
valid_letters.append(letter)

Увидите, насколько легче это, чтобы увидеть результат? На самом деле, вы даже можете сделать это более компактно:

valid_letters = [letter for letter in sortedletters if letter in wholealphabet]

missingletters = ""

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

    for letter in wholealphabet:
if sortedletters.count(letter) == 0:
missingletters +=letter

Опять же, вы можете упростить это с помощью comphrehension список

missingletters = [letter for letter in wholealphabet if letter not in sortedletters]

if len(missingletters) == 0:
print("NULL")
else:
print(missingletters)

Как kojrio очков, если вы используете наборы в Python вы можете легко осуществить это. Его советы использовать оператор with тоже хорошо.

5
ответ дан 27 ноября 2011 в 04:11 Источник Поделиться