我正在学习Python列表。在这段代码中,我尝试添加一个字符串s
,它来自于表单到表的行,只要字符串是相同的。当字符串不同时,新字符串将写入下一列。在
我可以将字符串从column 0
写入column 1
,但在column 1
上添加相同的字符串时遇到了问题。在
实际上,脚本只在将不同的字符串放到下一列时起作用。在
我意识到这样做是不对的。在
我会很感激你的帮助。谢谢您。我也包括模板。在
编辑2
@JerseyMike:谢谢你的回答。我还不明白AddString(str)
是如何工作的,但在空闲状态下尝试它时,我发现它没有添加新字符串,而是用新字符串替换了它。正如我所说的,我还没有研究它是如何工作的;但以下是结果(我将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:
谢谢,对不起,我意识到问题不清楚。在这个应用程序中;用户输入同一个句子;喜欢练习外语。所以输入将是
^{pr2}$如果用户在下一个“Hello universe”中键入,则会转到下一列:
Hello world Hello Universe
Hello world
Hello world
如果用户继续输入“Hello Universe”,他们应该在同一列下
Hello world Hello Universe
Hello world Hello Universe
Hello world Hello Universe
Hello Universe
Hello Universe
包含这个的列表如下:
L = [
['Hello world', 'Hello Universe'],
['Hello world', 'Hello Universe'],
['Hello world', 'Hello Universe'],
['', 'Hello Universe'],
['', 'Hello Universe']
]
最初列表是空的,我用L.append(s)
添加字符串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]
。为此,我搜索左边的列表以找到最后一个子列表(或类似的内容)。我还没有研究如何搜索列表。再次感谢你的帮助。在
结束
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>
如果我是你,我就不会使用嵌套列表。相反,使用字典。在
使用字典可以做的是将键(您希望每个键对应一行的字符串)映射到值(在本例中,不管字符串出现的次数是多少,还是表中该行中的列数)。在
所以,你可以这样做:
可以使用
dict[string]
引用表中的单个字符串或行,并查看该行有多少列。在使用嵌套式词典,比使用嵌套式列表更快捷、更高效。在
如果你真的要用嵌套列表来做这件事,请告诉我,我会尽力帮助你的。在
在我看来,你想把所有的东西都塞进一个列表中,这会让你的代码很难写。需要注意的是,您在列表中添加了空白字符串('')来填充它,这有点警告您的数据结构是错误的。 与其这样做,我会使用一个字典,键入id或原始文本,然后将用户输入存储为一个列表,然后整理出如何在代码的显示部分显示这些内容。比如:
请记住,词典是无序的,因此您可能需要使用列表来排序,或者使用collections库中的sorteddict。在
如果字符串的顺序很重要,字典就是个问题。你使用列表是正确的,但我认为你需要的不仅仅是这些。老实说,我不清楚对于不同的数据集,您的输出会是什么样子。如果我没看错你的问题,以下是真的吗?在
输入:
最后一行后的输出:
^{pr2}$如果没有,请用一个例子重新表述你的预期输出。在
好吧,看来我对你问题的看法是正确的。这是个好的开始。;)
我认为我们需要从另一个角度来看待这个问题。目前,你把它看作是所有数据的一个大列表,也许这太多了。我在这里看到的是一个元组列表,其中每个元组代表一个列(string,count)。元组将是这个列中应该是什么字符串以及应该有多少个字符串。所以你的例子最后看起来像:
L = [("Hello World", 3), ("Hello Universe", 5)]
我知道如何处理这些数据并不明显,但我认为在内部表示它是正确的方法。我将给您一些示例代码来执行这种数据类型的一些基本操作(其他人可能有更有效的方法来做同样的事情)。在
添加新字符串:
打印HTML表的内部:
所以不管怎样,我就是这么做的。在
相关问题 更多 >
编程相关推荐