我正在尝试学习Python列表。在此代码中,我尝试将表单中的字符串s
添加到表行,只要字符串相同即可。当字符串不同时;新字符串将写入下一列。
我可以将字符串从column 0
写到column 1
,但我在column 1
上正确添加相同的字符串时遇到了问题。
它的方式;该脚本仅适用于将不同的字符串放到下一列。
我意识到这不是正确的做法。
我将不胜感激任何帮助。谢谢。我也包括模板。
EDIT2
@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 Universe”,他们应该在同一列
下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个元素的最后一个子列表(或类似的东西)。我还没有研究如何搜索列表。再次感谢您的帮助。
结束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>
答案 0 :(得分:2)
如果字符串的顺序很重要,字典将是一个问题。你使用列表是在正确的道路上,但我认为你需要的不仅仅是这些。老实说,我不清楚你的输出对于不同的数据集会是什么样子。如果我正确地阅读了您的问题,以下是真的吗?
输入:
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>"
无论如何,这就是我做的方式。
答案 1 :(得分:0)
如果我是你,我不会使用嵌套列表。相反,请使用字典。
你可以用字典做的是映射键(你想要一行的字符串)到值(在这种情况下,无论字符串出现多少次,或表中该行的列数)。
所以,你可以做一些像这样的事情:
def add_item(item, dict):
if item in dict:
dict[item] += 1
else:
dict[item] = 1
您可以使用dict[string]
引用表中的单个字符串或行,并查看该行有多少列。
此外,使用字典比使用嵌套列表更简洁,内存效率更高。
如果您真的必须使用嵌套列表执行此操作,请告诉我,我会尽力帮助您。
答案 2 :(得分:0)
在我看来,你正试图将所有东西都塞进一个列表中,这会让你的代码难以编写。需要注意的是,您要在列表中添加空白字符串('')以填充它,这是一个警示标志,表明您的数据结构是错误的。 而不是那样做,我会使用一个字典来键入id或原始文本,然后将用户输入存储为列表,然后在代码的显示部分中显示如何显示它。类似的东西:
typing = {
'Hello World': ['Hello World', 'Hello World', 'Hello World']
'Hello Universe': ['Hello Universe', 'Hello Universe', 'Hello Universe', ...]
}
请记住,字典是无序的,因此您可能需要使用列表来对它们进行排序,或者使用集合库中的sorteddict。