Питонический метод определения того, изменяется ли содержимое списка с нечетных на четные значения

Я пишу несколько тестовых примеров, и мои мысли блуждают, предполагая, что есть лучший способ написать что-то вроде этого. У меня есть список, номера которого переходят от всех нечетных значений ко всем четным, независимо от того, где. Я должен утверждать, что это так, вот что я придумал:

values = [1, 3, 5, 7, 5, 3, 5, 3, 5, 7, 4, 6, 8, 4, 2, 2, 8, 6]

# find all the indexes of odd and even values
odds = [i for (i, v) in enumerate(values) if v % 2 == 1]
evens = [i for (i, v) in enumerate(values) if v % 2 == 0]

# indexes should be a continuous sequence: 0, 1, 2, 3 ... n
assert odds + evens == range(evens[-1] + 1)

Кажется, предстоит долгий путь. автор (id, имя пользователя) и т. д. author_vote (post_id, author_id, value) Значение - tiny_int, которое может быть 1 или -1. Я хочу посчитать ...

У меня есть следующие таблицы:

post (id, title, content) etc
author (id, username) etc
author_vote (post_id, author_id, value)

Значение - tiny_int, которое может быть либо 1, либо -1.

Я хочу подсчитать количество положительных и отрицательных голосов для каждого сообщения :

$posts = sql_select($link, "SELECT post.*, author.username 
                            FROM post, author 
                            AND author.id = post.author_id");

Почему следующий код не работает?

array_walk($posts, function(&$post, $link){
   $post['positive'] = sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $post['id']
                                            AND value  = 1");

   $post['negative'] = abs(sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $post['id']
                                            AND value  = -1"));
});

Я также пробовал следующее, это приводит к тому, что все голоса одинаковы для каждого сообщения:

foreach ($posts as &$post)
{
   $id = $post['id'];
   $post['positive'] = (int)sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $id
                                           AND value  = 1");
   $post['negative'] = (int)abs(sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $id
                                               AND value  = -1"));
}

Также есть ли способ сделать это без необходимости запрашивать базу данных несколько раз для каждого сообщения? Как что-то, что постоянно изменяется [например], может быть (mem) кэшировано?

5
задан jonnnnnnnnnie 20 April 2011 в 22:11
поделиться