Сначала я собрал бы ваши позиции в сетке в collections.defaultdict
или наборах, а затем перестроил строки строчными буквами, если их позиции существуют в этих наборах.
Демонстрация:
from collections import defaultdict
grid1 = ["PIGATOS", "ANRBKFD", "TMCAOXA", "OOBBYQU", "MACOUIV", "EEJMIWL"]
positions_words_occupy = (
(0, 0),
(1, 0),
(2, 0),
(3, 0),
(0, 2),
(0, 3),
(0, 4),
(0, 5),
(3, 2),
(4, 3),
(5, 4),
(2, 2),
(2, 3),
(2, 4),
)
d = defaultdict(set)
for grid, pos in positions_words_occupy:
d[grid].add(pos)
result = []
for grid, pos in d.items():
result.append(
"".join(x.lower() if i in pos else x for i, x in enumerate(grid1[grid]))
)
print(result)
Выход:
['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']
if (foo == true)
{
do stuff
}
Я продолжаю говорить разработчику, который делает это, что это должно быть
if ((foo == true) == true)
{
do stuff
}
но он еще не получил подсказку.
Используя массив, когда Вы хотите поведение набора. Необходимо проверить все для проверки не в массиве перед вставкой его который делает код дольше и медленнее.
Я часто сталкиваюсь со следующим:
function foo() {
if ( something ) {
return;
} else {
do_something();
}
}
Но это не помогает сообщению их, что еще бесполезно здесь. Это должно быть также
function foo() {
if ( something ) {
return;
}
do_something();
}
или - в зависимости от продолжительности проверок, которые сделаны прежде do_something ():
function foo() {
if ( !something ) {
do_something();
}
}
От кошмарных обзоров кода.....
char s[100];
сопровождаемый
memset(s,0,100);
сопровождаемый
s[strlen(s)] = 0;
с большим количеством противных
if (strcmp(s, "1") == 0)
разбросанный код.
Дублирование вставки копии:
if (x > 0)
{
// a lot of code to calculate z
y = x + z;
}
else
{
// a lot of code to calculate z
y = x - z;
}
вместо
if (x > 0)
y = x + CalcZ(x);
else
y = x - CalcZ(x);
или еще лучше (или более запутываемый)
y = x + (x > 0 ? 1 : -1) * CalcZ(x)
Выделение элементов на "куче" вместо стека.
{
char buff = malloc(1024);
/* ... */
free(buff);
}
вместо
{
char buff[1024];
/* ... */
}
или
{
struct foo *x = (struct foo *)malloc(sizeof(struct foo));
x->a = ...;
bar(x);
free(x);
}
вместо
{
struct foo x;
x.a = ...;
bar(&x);
}
Страх перед пустым указателем (это также может привести к серьезным проблемам):
if (name != null)
person.Name = name;
Избыточный if's (еще не использующий):
if (!IsPostback)
{
// do something
}
if (IsPostback)
{
// do something else
}
Избыточные проверки (Разделение никогда не возвращает пустой указатель):
string[] words = sentence.Split(' ');
if (words != null)
Больше на проверках (вторая проверка избыточна, если Вы собираетесь циклично выполниться),
if (myArray != null && myArray.Length > 0)
foreach (string s in myArray)
И мой фаворит для ASP.NET: Рассеянный DataBind
s на всем протяжении кода для создания рендеринга страницы.
Помещение exit
оператор как первый оператор в функции, который отключит выполнение той функции вместо одной из следующих опций:
Используя exit
поскольку первый оператор делает его очень трудно для определения, можно легко перечитать по нему.
void myfunction() {
if(condition) {
// Do some stuff
if(othercond) {
// Do more stuff
}
}
}
вместо
void myfunction() {
if(!condition)
return;
// Do some stuff
if(!othercond)
return;
// Do more stuff
}
У меня когда-то был парень, который неоднократно делал это:
bool a;
bool b;
...
if (a == true)
b = true;
else
b = false;
Избыточный код не является сам по себе ошибкой. Но если Вы действительно пытаетесь сохранить каждый символ
return (condition);
избыточно также. Можно записать:
return condition;
Объявление отдельно от присвоения на языках кроме C:
int foo;
foo = GetFoo();
Где-нибудь я определил эту вещь, которую я нахожу, чтобы быть вершиной булева дублирования:
return (test == 1)? ((test == 0) ? 0 : 1) : ((test == 0) ? 0 : 1);
:-)
Используя комментарии вместо управления исходным кодом:
- Комментирование или переименование функций вместо того, чтобы удалить их и положить, что управление исходным кодом может вернуть их для Вас в случае необходимости.
- Добавление комментариев как "Изменение RWF" вместо того, чтобы просто внести изменение и позволить управлению исходным кодом возложить вину.
Избыточный.ToString () вызовы:
const int foo = 5;
Console.WriteLine("Number of Items: " + foo.ToString());
Ненужное строковое форматирование:
const int foo = 5;
Console.WriteLine("Number of Items: {0}", foo);
if (condition == true)
{
...
}
вместо
if (condition)
{
...
}
Править:
или еще хуже и оборачивающийся условный тест:
if (condition == false)
{
...
}
который легко читается как
if (condition) then ...
Самая распространенная конструкция избыточного кода, которую я вижу, - это код, который никогда не вызывается из любого места в программе.
Другой - шаблоны проектирования, используемые там, где их нет смысла. Например, везде писать «new BobFactory (). CreateBob ()», а не просто писать «new Bob ()».
Удаление неиспользуемого и ненужного кода может значительно улучшить качество системы и способность команды поддерживать его. . Преимущества часто поражают команды, которые никогда не думали об удалении ненужного кода из своей системы. Однажды я провел обзор кода, сидя с командой и удалив более половины кода в их проекте, не изменяя функциональность их системы. Я думал, что они обидятся, но после этого они часто просили меня дать совет по дизайну и отзывы.