从元组列表中提取值(在这种情况下,列表中只有一个元组)

时间:2013-01-14 18:58:55

标签: python google-app-engine google-cloud-datastore tuples

我在python GAE工作。

无法弄清楚为什么我无法使用[index]从我的元组中提取值。从日志中,我可以看到我的leveloneAdd变量中有值,例如('english''subject') - 但是当我循环播放1的元组时,我的变量taghtype中的空洞变得空洞 - 当我'我期待tag = 'english'htype = 'subject'

有人有任何想法吗?

for each in leveloneAdd:
    tag = each[0]
    htype = each[1]
    q1 = Level_1_Headings.all().filter("name1 =",tag).filter("heading_type =",htype).get()

所以我按照Martijn的建议在日志中做了repr,这是我的日志: 感谢您的输入!喜欢这个板子 - 这是我的日志,使用Martijn的建议---我认为它正在解释整个事情就像一个字符串---

INFO     2013-01-14 19:28:17,030 main.py:291] each is ('math', 'subject')
INFO     2013-01-14 19:28:17,030 main.py:292] u"('math', 'subject')"
INFO     2013-01-14 19:28:17,030 main.py:294] tag is (
INFO     2013-01-14 19:28:17,030 main.py:296] heading type is '

看起来字符串被视为字符串?如何将其转换为读取作为真正的元组。这是我的原始代码,其中应该创建元组(然后它将转到客户端,然后返回到日志中显示的那个。)

对于h1中的x:      listone.append((STR(x.name1),STR(x.heading_type)))

上述值位于输入选择下拉框表单中 然后从服务器端python - 我得到的值由
    leveloneAdd =(self.request.get_all(“list_uno []”))

对不起,如果这些似乎是基本的问题,我是一个初学者,试图变得更好!!

3 个答案:

答案 0 :(得分:2)

如果leveloneAdd == ('english', 'subject')那么它不是元组列表,它只是一个元组,所以在循环的每次迭代中each将字符串作为值。

如果leveloneAdd == [('english', 'subject')]是一个里面有元组的列表,那么你的代码可以正常工作。

你最好的选择,如果可以的话,就是修复代码,这样leveloneAdd总是一个元组列表,如果你不能这样做那么你必须通过使levelone添加一个列表来修复它,当它是一个元组时里面有两个字符串。请小心,测试所有输入,因为在处理这种转换时很容易出错。

docs中说get_all应该返回一个列表,也许它只在有多个参数时返回一个列表。如果是这种情况,您可以将值转换为列表,如果它是一个字符串:

if isinstance(leveloneAdd, basestring):
    leveloneAdd = [leveloneAdd]

之后只需将leveloneAdd的值与','

分开

同时调整您的Javascript以避免额外的字符,例如“(”和“'”

答案 1 :(得分:1)

试试这个:

for (tag, htype) in leveloneAdd:
    # stuff

如果它不是一个元组,你会得到类似“解压缩的值太多”的错误。


我误读了OP。

当我遇到这样的问题时,我通常会尝试这样的事情:

for thing in list:
    try:
        (tag, htype) = thing
    except:
        import pdb
        pdb.set_trace()

然后你将获得调试器,你可以看到'thing'是否符合您的想法。


根据OP,'thing'不是元组,而是unicode字符串。要解决您的问题,请转换为字符串,然后拆分字符串。代码如下:

thing = u'(a,b)'
[tag, htype] = str(thing).lstrip('(').rstrip(')').split(',')

这假设你总是期待两个条目的元组。

答案 2 :(得分:1)

F.C.说的是真的。

我对单元素与元组问题有点困惑。如果基本问题只是检测你是否有leveloneAdd元素的简单值或元组,也许你会考虑将listoneAdd作为元组列表,即使你添加的是一个元素单个元素。这样,当您从列表中提取元素时,您将始终知道可以将其编入索引:

listoneAdd = [('one',), ('foot',), ('three', 'pigs')]
for element in listoneAdd:
    print "element is " + str(element)
    for i in range(0,len(element)):
        print "    do something with value " + element[i]`

得到以下特性:

element is ('one',)
    do something with value one
element is ('foot',)
    do something with value foot
element is ('three', 'pigs')
    do something with value three
    do something with value pigs`