【问题标题】:Select value from list of tuples where condition从条件的元组列表中选择值
【发布时间】:2011-12-14 03:29:55
【问题描述】:

我有一个元组列表。每个元组有 5 个元素(对应 5 个数据库列),我想做一个查询

select attribute1 from mylist where attribute2 = something

例如

personAge = select age from mylist where person_id = 10

是否可以通过某种方式查询元组列表?

【问题讨论】:

    标签: python list tuples


    【解决方案1】:

    如果你有named tuples,你可以这样做:

    results = [t.age for t in mylist if t.person_id == 10]
    

    否则使用索引:

    results = [t[1] for t in mylist if t[0] == 10]
    

    或者按照 Nate 的回答使用元组解包。请注意,您不必为解包的每件物品指定一个有意义的名称。您可以使用(person_id, age, _, _, _, _) 来解压缩一个六项元组。

    【讨论】:

      【解决方案2】:

      对此的一种解决方案是列表推导,在您的元组中进行模式匹配:

      >>> mylist = [(25,7),(26,9),(55,10)]
      >>> [age for (age,person_id) in mylist if person_id == 10]
      [55]
      

      另一种方法是使用mapfilter

      >>> map( lambda (age,_): age, filter( lambda (_,person_id): person_id == 10, mylist) )
      [55]
      

      【讨论】:

        【解决方案3】:

        是的,如果您知道所需列位于元组中的哪个位置,则可以使用过滤器。如果情况是 id 是元组的第一个元素,那么您可以像这样过滤列表:

        filter(lambda t: t[0]==10, mylist)
        

        这将返回相应元组的列表。如果您想要年龄,只需选择您想要的元素。除了过滤器,您还可以使用列表理解并在第一时间选择元素。您甚至可以立即解压(如果只有一个结果):

        [age] = [t[1] for t in mylist if t[0]==10]
        

        但我强烈建议为此使用dictionariesnamed tuples

        【讨论】:

        • 但是如果 OP 想要使用不同的限定符怎么办?例如,一个范围而不是一个值?这将排除使用字典。
        • @Nate 正如我所理解的那样,他有一个同质元组列表,例如:[(1,'name', 20, 'bar'),(2,'name2', 33, 'foo'), ...],如果我想使用它,我会将每个元组映射到字典中,例如:[{'id': 1, 'name': 'name', 'age': 20, 'etc': 'bar'}, ..]。查询它会变得更具可读性。如果我只通过 id 进行查询,我什至可以将它用作字典键(所以它会是字典的字典)。
        • 我想我的意思是,如果他想select where person_id > 5 and person_id < 15 或类似的东西,字典就无法执行这种搜索;另外,如果他想按年龄选择呢?在这两种情况下,您都必须执行某种字典理解。
        • 在字典列表的情况下,它就像[t for t in data where t['id'] > 5 and t['id'] < 15] 一样简单。您可以通过这种方式选择基本上任何东西(只要它只需要一条线进入透视图)。
        【解决方案4】:

        基于 Nate 的回答:如果您的列表包含具有非唯一值的元组,这可能会产生一个布尔值 ValueError(一个系列的真值是不明确的)。为了避免这种情况:

        mylist = [(25,7),(26,9),(55,10)]
        [age for (age,person_id) in mylist if any(person_id == 10)]
        

        对于“person_id”显然不太直观,但假设您切换查询:查找给定年龄的人的所有 person_ID。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-18
          • 1970-01-01
          • 2022-07-05
          相关资源
          最近更新 更多