Условные операторы со списками Python - PullRequest
2 голосов
/ 25 октября 2010

Я пытаюсь изучить списки Python.В этом коде я пытаюсь добавить строку s из формы в строку таблицы, если строка совпадает.Когда строка отличается;новая строка записывается в следующий столбец.

Я мог бы написать строку с column 0 до column 1, но у меня были проблемы с добавлением этой же строки на column 1 правильно.

так оно и есть;скрипт работает только до помещения другой строки в следующий столбец.

Я понимаю, что это неправильный способ сделать это.

Буду признателен за любую помощь.Спасибо.Я также включил шаблон.

РЕДАКТИРОВАТЬ2

@ JerseyMike: Спасибо за ваш ответ.Я пока не понимаю, как работает AddString(str), но пробуя его в IDLE, я заметил, что вместо добавления новой строки он заменяет ее новой строкой.Как я уже сказал, я еще не изучал, как это работает;но вот результат (я изменил str на str1):

>>> def AddString(str1):
    try:
        idx = map(lambda (s, v): ('N', 'Y')[s == str1], L).index('Y')
    except:
        L.append((str1, 1))
    else: L[idx] = (str1, L[idx][1] + 1)


>>> L = []
>>> str1 = 'hello'
>>> AddString(str1)
>>> L
[('hello', 1)]
>>> AddString(str1)
>>> L
[('hello', 2)]
>>> 

РЕДАКТИРОВАТЬ

@ JerseyMike:

Спасибо,Извините, я понял, что вопрос не ясен.В этом приложении;пользователь печатает в одном предложении;люблю заниматься иностранным языком.Таким образом, ввод будет

Hello world
Hello world
Hello world

, и если пользователь введет в следующем «Hello Universe», то он перейдет в следующий столбец:

Hello world  Hello Universe
Hello world
Hello world

и если пользователь продолжит вводить «Hello»Вселенная "они должны идти под одним столбцом

Hello world  Hello Universe
Hello world  Hello Universe
Hello world  Hello Universe
             Hello Universe
             Hello Universe

Список L, содержащий это выглядит следующим образом:

L = [
     ['Hello world', 'Hello Universe'], 
     ['Hello world', 'Hello Universe'], 
     ['Hello world', 'Hello Universe'], 
     ['',            'Hello Universe'], 
     ['',            'Hello Universe']
    ]

Изначально список пуст, и я добавляю строку s сL.append(s).

L = [
     ['Hello world'], 
     ['Hello world'], 
     ['Hello world'], 
    ]

Если последняя строка s не соответствует новому вводу, я создаю новый столбец с L[0].insert(1,s).

L = [
     ['Hello world', 'Hello Universe'], 
     ['Hello world'], 
     ['Hello world'], 
    ]             

Теперь мне нужно написатьпод 'Hello Universe' Мне оказалось трудно это понять по нескольким причинам.Но теперь я думаю, что может быть лучше добавить новую строку s в список, прежде чем проверять, совпадает ли она с предыдущей строкой.Для упрощения списка предположим, что L выглядит следующим образом:

L = [['A'], ['A'], ['A'], ['B']]

Теперь ['B'] необходимо вставить в L[0].Для этого я ищу в списке слева последний подсписок с 1 элементом (или что-то в этом роде).Я еще не изучал, как искать списки.Еще раз спасибо за помощь.

END EDİT


class Test(webapp.RequestHandler):
    myList = []
    def get(self):        
#        del self.myList[:]        
        s = [self.request.get('sentence')]
        r = len(self.myList)

        if r == 0: 
            self.myList.append(s)
            htmlcode1 = HTML.table(self.myList)
            lastItem = s  
        else:   
            if len(self.myList[0]) == 1:
                lastItem = self.myList[r-1]        
                if s == lastItem:
                    self.myList.append(s)             
                    htmlcode1 = HTML.table(self.myList)                
                else:
                    s = self.request.get('sentence') 
                    self.myList[0].insert(1,s)       
                    htmlcode1 = HTML.table(self.myList)
            if len(self.myList[0]) == 2:                
                    self.myList[1].insert(1,s)
                    htmlcode1 = HTML.table(self.myList)
            elif len(self.myList[1]) == 2:             
                    self.myList[2].insert(1,s)
                    htmlcode1 = HTML.table(self.myList)

        template_values = {'htmlcode1': htmlcode1,
                           's': s,
                           'r': r,
                           'myList': self.myList,
#                           'myListLen': myListLen,
                           'lastItem': lastItem,
                          }

        path = os.path.join(os.path.dirname(__file__), 'test.mako')
        templ = Template(filename=path)
        self.response.out.write(templ.render(**template_values))    

Шаблон

<html>
<head>
</head>
<body>

<p>| <a href="/delete">CLEAR</a> |</p>

<form action="/test" method="get">
<input name="sentence" type="text" size="30"><br />
      <input type="submit" value="Enter">
</form>

<p>${htmlcode1}</p>
<p>s: ${s}</p>
<p>r: ${r}</p>
<p>myList: ${myList}</p>
<p>lastItem: ${lastItem}</p>

</html>
</body>

Ответы [ 3 ]

2 голосов
/ 25 октября 2010

Если важен порядок строк, то возникнет проблема со словарем.Вы находитесь на правильном пути, используя списки, но я думаю, что вам нужно нечто большее.Честно говоря, мне не ясно, как будут выглядеть ваши выводы для разных наборов данных.Если я правильно прочитал ваш вопрос, верно ли следующее:

Ввод:

Sentence 1
Sentence 3
Sentence 1
Sentence 1
Sentence 2
Sentence 2

Вывод после последней строки:

Sentence 1 | Sentence 3 | Sentence 2
Sentence 1 |            | Sentence 2
Sentence 1 |            |

Если нет, пожалуйста, перефразируйте ожидаемый результатвывод с примером.


Хорошо, похоже, мой взгляд на вашу проблему был верным.Это хорошее начало.;)

Я думаю, что мы должны смотреть на это с другой точки зрения.В настоящее время вы рассматриваете это как большой список всех данных, и, возможно, это слишком много.Здесь я вижу список кортежей, где каждый кортеж представляет столбец (строка, число).Кортежем будет какая строка должна быть в этом столбце и сколько их должно быть там.Таким образом, ваш пример в конечном итоге будет выглядеть так:

L = [("Hello World", 3), ("Hello Universe", 5)]

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

Добавить новую строку:

def AddString(str):
try:
    idx = map(lambda (s, v): ('N', 'Y')[s == str], L).index('Y')
except:
    L.append( (str, 1) )
else:
    L[idx] = (str, L[idx][1] + 1)

Распечатайте внутреннюю часть таблицы HTML:

def PrintChart():
try:
    max = reduce(lambda x, y: [x, y][x[1] < y[1]], L)[1]
except:
    print "<td></td>"
else:
    for i in range(max):
        print "<tr>"
        for (s, c) in L:
            if i+1 <= c:
                print "  <td" + s + "</td>"
            else:
                print "  <td></td>"
        print "</tr>"

Так или иначе, я бы так и сделал.

0 голосов
/ 28 октября 2010

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

typing = {
    'Hello World': ['Hello World', 'Hello World', 'Hello World']
    'Hello Universe': ['Hello Universe', 'Hello Universe', 'Hello Universe', ...]
}

Имейте в виду, что словари не упорядочены, поэтому вам может понадобиться использовать список для их упорядочения или использовать sorteddict из библиотеки коллекций.

0 голосов
/ 25 октября 2010

На вашем месте я бы не использовал вложенные списки. Вместо этого используйте словарь.

То, что вы можете сделать со словарем, - это сопоставить ключи (строки, для которых вы хотите, чтобы по одной строке каждая) со значениями (в данном случае, сколько раз эта строка встречалась или количество столбцов в этой строке таблицы).

Итак, вы можете сделать что-то вроде этого:

    def add_item(item, dict):
        if item in dict:
            dict[item] += 1
        else:
            dict[item] = 1

Вы можете ссылаться на отдельные строки или строки в таблице с помощью dict[string] и посмотреть, сколько столбцов в этой строке.

Кроме того, использование словаря намного более кратко, эффективно использует память и быстрее, чем использование вложенных списков.

Если вам ДЕЙСТВИТЕЛЬНО нужно сделать это с помощью вложенных списков, дайте мне знать, и я постараюсь помочь с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...