【问题标题】:How get corresponding element in sub list based on input element from the same list python如何根据来自同一列表python的输入元素获取子列表中的相应元素
【发布时间】:2022-01-18 06:53:45
【问题描述】:

我有这样的列表。

list=[[['name1','name2'],[n1,n2]], [['name3','name4'],[n3,n4]]]

如果输入是 name1

,我想获得 n1

同样如果输入 name3 那么输出应该是 n3

Note: name1-Type str
      n1-   Type int

有什么方法可以做到这一点吗?..请建议我解决这个问题的解决方案/解决方案步骤..

【问题讨论】:

  • 子列表是否保证为 2 个列表,每个列表有 2 个元素?
  • 是的,每个子列表中正好有 2 个元素

标签: python-3.x list sublist


【解决方案1】:

我看到从my_list 构建一个中间查找字典,然后随意查找:

my_list=[
  [['name1','name2'],['n1','n2']], 
  [['name3','name4'],['n3','n4']]
]

lookup = {}

for double_tuple in my_list:
    lhs, rhs = double_tuple
    zipped = zip(lhs, rhs)  # ['name1','name2'],['n1','n2'] → ['name1', 'n1'],['name2','n2']
    lookup.update(dict(zipped))

print(lookup['name1'])  # → 'n1'

【讨论】:

    【解决方案2】:

    通过列表推导可以轻松解决:

    1. 解压列表中的元素
    2. 过滤 k1 == 输入
    3. 获取第一个结果(如果存在)
    input_ = "name1"
    list_ = [[['name1','name2'],[n1,n2]], [['name3','name4'],[n3,n4]]]
    candidates = [v1 
                  for (k1, _), (v1, _) in list_
                  if k1 == input_]
    if len(candidates) == 0:
        print("No such key: " + input_)
    else:
        print("Value is " + candidates[0])
    

    注意:我在名称中使用了尾随下划线以避免覆盖内置函数(list 和 input)。覆盖内置函数是不好的做法。

    【讨论】:

      【解决方案3】:

      您可以将filter 与next 结合使用:

      def get_item_from_key(input_list, key):
          """Return item corresponding to a specific key"""
          try:
              return next(filter(lambda x: x[0][0] == key, input_list))[1][0]
          except StopIteration:
              return None
      

      所以,如果输入列表是a = [[['name1', 'name2'], [0, 1]], [['name3', 'name4'], [2, 3]]],你可以询问任何你感兴趣的键:

      get_item_from_key(a, 'name1')  # this will return 0
      get_item_from_key(a, 'name3')  # this will return 2
      get_item_from_key(a, 'name2')  # this will return None
      get_item_from_key(a, 'name5')  # this will return None
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 2017-04-19
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 2020-07-31
        • 1970-01-01
        相关资源
        最近更新 更多