从namedtuple记录结构中检索数据失败

时间:2016-06-27 02:02:01

标签: python class namedtuple

我需要创建一个查找表来存储表格数据,并根据多个字段值检索记录。

我找到了一个示例post # 15418386,它几​​乎可以满足我的需要,但无论传递的参数如何,它总是返回相同的记录。 我列出了这篇文章底部的代码,在casr中链接不起作用。

我已经验证了文件是否正确读取,并且使用IDE中的调试器(我正在使用PyCharm)正确填充数据表。

代码中包含的测试数据是:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/reactants"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="95dp"
        android:textSize="20sp"
        android:inputType="text" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/products"
        android:layout_alignBottom="@+id/reactants"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:textSize="20sp"
        android:inputType="text" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/balanced_equation"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:textSize="30sp" />

<!--should make text bold and black-->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/beq"
        android:id="@+id/title"
        android:textSize="35sp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textStyle = "bold"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button"
        android:id="@+id/button"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="45dp" />

</RelativeLayout>

该函数总是返回最后一条记录,我相信问题出在这些代码行中。但我不明白它是如何运作的。

name,age,weight,height
Bob Barker,25,175,6ft 2in
Ted Kingston,28,163,5ft 10in
Mary Manson,27,140,5ft 6in
Sue Sommers,27,132,5ft 8in
Alice Toklas,24,124,5ft 6in

我想了解代码应该如何工作,以便我可以编辑它以便能够搜索多个参数。

原始代码:

matches = [self.records[index]
            for index in self.lookup_tables[field].get(value, []) ]
return matches if matches else None

1 个答案:

答案 0 :(得分:0)

变量value将在以下if .. for ..块中被覆盖:

field, value = kwargs.items()[0]   # <--- `value` defined

...

if field not in self.lookup_tables:
    for index, record in enumerate(self.records):
        value = getattr(record, field)  # <--- `value` overwritten
        self.lookup_tables[field][value].append(index)

因此,value指的是最后一条记录的值。您需要使用其他名称来防止这种覆盖。

if field not in self.lookup_tables:
    for index, record in enumerate(self.records):
        v = getattr(record, field)
        self.lookup_tables[field][v].append(index)