【问题标题】:Making a list from a list of lists, using the same repeated index number for each list created by the enumerate method从列表列表中创建列表,对 enumerate 方法创建的每个列表使用相同的重复索引号
【发布时间】:2020-04-20 18:53:19
【问题描述】:

我的函数desired_headers() 从“结果”对象中删除元组,其中元组中的第一个元素与标题列表中的任何字符串都不匹配。来自 result1 对象的 ['Fish', 'Dolphin']['Local Auth', 'bucket'] 已从 result3 中删除。

然后它打印索引号和元组列表,如下面的当前输出所示。

我的目标是使用我当前的输出将元组列表“重新打包”在一起并存储在一个对象中。

headers2 = ['Group', 'Owner', 'Person in charge', 'Type of Service',
                    'Registered Care Categories*', 'Specialist Care Categories',
                    'Languages Spoken by Staff (other than English)','Single Rooms', 
                    'Shared Rooms','Facilities & Service']


result1 = [['Group', 'MacIntyre'], ['Person in charge', ' Vivienne Donald (Manager)'],
           ['Type of Service', 'good'], ['Fish', 'Dolphin'], ['Shared Rooms', '4']]

result2 = [['Group', 'Jameseson'], ['Type of Service', 'bad'], ['Shared Rooms', '8']]

result3 = [['Group', 'MacIntyre'], ['Person in charge', ' Vivienne Donald (Manager)'],
           ['Type of Service', 'good'], ['Shared Rooms', '4'], ['Local Auth', 'bucket']]

results = [result1, result2, result3]

#Removes tuples which the first element in the tuple does not matcch any string in headers2 list
def desired_headers():
  for index, z in enumerate(list(range(len(results)))):
     for i in list(range(len(results[z]))):
       if any(x in headers2 for x in results[z][i]):  
           print(index, results[z][i])



desired_headers()

当前输出:

0 ['Group', 'MacIntyre']
0 ['Person in charge', ' Vivienne Donald (Manager)']
0 ['Type of Service', 'good']
0 ['Shared Rooms', '4']
1 ['Group', 'Jameseson']
1 ['Type of Service', 'bad']
1 ['Shared Rooms', '8']
2 ['Group', 'MacIntyre']
2 ['Person in charge', ' Vivienne Donald (Manager)']
2 ['Type of Service', 'good']
2 ['Shared Rooms', '4']

期望的输出:

[[['Group', 'MacIntyre'],
  ['Person in charge', ' Vivienne Donald (Manager)'],
  ['Type of Service', 'good'],
  ['Shared Rooms', '4']],
 [['Group', 'Jameseson'], ['Type of Service', 'bad'], ['Shared Rooms', '8']],
 [['Group', 'MacIntyre'],
  ['Person in charge', ' Vivienne Donald (Manager)'],
  ['Type of Service', 'good'],
  ['Shared Rooms', '4']]]

【问题讨论】:

  • for index, z in enumerate(list(range(len(results))))索引和z值一样^^
  • 顺便说一句,不要使用list(range(...)),只使用range(...)
  • 元组是包含两项的非列表。你所拥有的是一个列表列表。

标签: python list for-loop indexing enumerate


【解决方案1】:

你可以通过列表理解来做到这一点:

filtered = [ [sl for sl in r if sl[0] in headers2] for r in results ]

输出:

print(filtered)

[
    [
        ['Group', 'MacIntyre'],
        ['Person in charge', ' Vivienne Donald (Manager)'],
        ['Type of Service', 'good'],
        ['Shared Rooms', '4']
    ],
    [
        ['Group', 'Jameseson'],
        ['Type of Service', 'bad'],
        ['Shared Rooms', '8']
    ],
    [
        ['Group', 'MacIntyre'],
        ['Person in charge', ' Vivienne Donald (Manager)'],
        ['Type of Service', 'good'],
        ['Shared Rooms', '4']
    ]
]

如果你有很多数据,你可能想用headers2 做一个集合来用在列表推导中

【讨论】:

    【解决方案2】:

    你需要这样的东西吗?这会将所有内容分组到一个列表中

    # Removes tuples which the first element in the tuple does not matcch any string in headers2 list
    def desired_headers():
        grouped_elements = []
        for index, z in enumerate(list(range(len(results)))):
            inner_loop = []
            for i in list(range(len(results[z]))):
                if any(x in headers2 for x in results[z][i]):
                    inner_loop.append(results[z][i])
    
            grouped_elements.append(inner_loop)
    
        print(grouped_elements)
    

    【讨论】:

      【解决方案3】:

      试试这个

      lv1 = [] # initialize an empty list which we will append to based on our criteria
      
      for lst in results: # loop though each element of the list, which itself is a list
          lv2 = []
          for el in lst: # Same as above
              if el[0] in headers2: # check if first element of the list exists in headers2
                  lv2.append(el)
          lv1.append(lv2)
      
      lv1
      

      或者如果你想要一个函数

      
      def desired_headers(list_of_lists, inclution_list):
          lv1 = []
      
          for lst in list_of_lists:
              lv2 = []
              for el in lst:
                  if el[0] in inclution_list:
                      lv2.append(el)
              lv1.append(lv2)
      
          return lv1
      
      desired_headers(list_of_lists=[result1, result2, result3], inclution_list=headers2)
      

      或者如果您熟悉列表理解

      result = [] 
      
      for lst in [result1, result2, result3]:
          result.append([el for el in lst if el[0] in headers2])
      
      result 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 2016-11-05
        • 2017-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多