Я рекомендовал бы фокусироваться на удобочитаемости и простоте для чего-то вроде этого. Легко потеряться при попытке удовлетворить несколько условий и тяжелее выяснить то, что Вы делали, когда Вы возвращаетесь к коду позже, при попытке быть умными, или максимально краткими. При создании требований отдельными и явными, можно более легко видеть тестирование их правильно. Ранние возвраты могут сохранить Ваш код менее с отступом и легче читать также.
def element_is_good(element, length):
return isinstance(element, int) and 0 <= element < length
def sublist_is_good(sublist, length):
return (isinstance(sublist, list)
and len(sublist) == length
and all(element_is_good(element, length) for element in sublist))
def list_of_lists_is_good(list_of_lists):
n = len(list_of_lists)
return n > 0 and all(sublist_is_good(sublist, n) for sublist in list_of_lists)
Это немного длиннее, чем другие решения, но я утверждал бы, что легче читать, легче протестировать полностью, и более удобный в сопровождении. (Это также удовлетворяет весь требования, которые Вы перечислили; DroiX86 примет пустой список или список словарей, и , kmario23 примет пустой массив или список кортежей. Я опустил Ваш "n, международное" требование, потому что функция len только возвращает ints.)
В Linq есть особое ключевое слово, которое вы могли бы используйте.
Конечно, вот синтаксис LINQ в C #:
from word in words
group word into occurrences
select new
{
Word = occurrences.Key,
Count = occurrences.Count()
}
Или в «чистых» вызовах методов C #:
words.GroupBy(w => w)
.Select(o => new
{
Word = o.Key,
Count = o.Count()
});
А для создания отдельного списка слов вы просто используете оператор Distinct:
words.Distinct();