【问题标题】:Create nested list from list in python从python中的列表创建嵌套列表
【发布时间】:2022-01-19 05:59:06
【问题描述】:

需要从python中的列表中获取嵌套列表

list_values=[('BNB', '161221'),
 ('BNB', '171221'),
 ('BNB', '241221'),
 ('BNB', '280122'),
 ('BNB', '311221'),
 ('BTC', '161221'),
 ('BTC', '171221'),
 ('BTC', '241221'),
 ('BTC', '250222'),
 ('BTC', '250322'),
 ('BTC', '280122'),
 ('BTC', '311221')]

所需列表的输出是

List_op=[[('BNB', '161221'),
 ('BNB', '171221'),
 ('BNB', '241221'),
 ('BNB', '280122'),
 ('BNB', '311221')],
[('BTC', '161221'),
 ('BTC', '171221'),
 ('BTC', '241221'),
 ('BTC', '250222'),
 ('BTC', '250322'),
 ('BTC', '280122'),
 ('BTC', '311221')]]

我尝试了一些列表理解方法,但无法得到这个。感谢您的帮助。

【问题讨论】:

  • 请分享您的尝试并解释问题所在。另外,您是想找到简单的东西还是快速的东西?您真的需要这些数据来处理大型数据吗?元组的第一个元素是否有两个以上的值,或者总是 2?
  • new_list=[] for i in filtered_final_product_list: if str(i[0])==str(i[1]): new_list.append(i) print(new_list) 但这不会追加和list 的变量不是静态的。有很多元素@Grismar
  • 有两个以上的元素,需要的数据只是小列表,只需要简单的工作答案..@Grismar
  • 您是否尝试对具有相同第一个值的元组进行分组?从这个问题来看,您的确切意图有些不清楚。
  • 是的..@UnderscoreA

标签: python list arraylist nested


【解决方案1】:

一个简单的解决方案:

from collections import defaultdict

list_values = [
    ('BNB', '161221'),
    ('BNB', '171221'),
    ('BNB', '241221'),
    ('BNB', '280122'),
    ('BNB', '311221'),
    ('BTC', '161221'),
    ('BTC', '171221'),
    ('BTC', '241221'),
    ('BTC', '250222'),
    ('BTC', '250322'),
    ('BTC', '280122'),
    ('BTC', '311221')
]

# a dict might be a better data type here
result = defaultdict(list)
for k, v in list_values:
    result[k].append(v)
print(result)

# but if you need a list of lists instead of a dictionary:
result = defaultdict(list)
for k, v in list_values:
    result[k].append((k, v))
list_op = [*result.values()]
print(list_op)

输出:

defaultdict(<class 'list'>, {'BNB': ['161221', '171221', '241221', '280122', '311221'], 'BTC': ['161221', '171221', '241221', '250222', '250322', '280122', '311221']})
[[('BNB', '161221'), ('BNB', '171221'), ('BNB', '241221'), ('BNB', '280122'), ('BNB', '311221')], [('BTC', '161221'), ('BTC', '171221'), ('BTC', '241221'), ('BTC', '250222'), ('BTC', '250322'), ('BTC', '280122'), ('BTC', '311221')]]

【讨论】:

  • 不客气,请选择最适合您的答案并用复选标记接受,这样问题就不再显示为未回答
【解决方案2】:

这不是最优雅的方式,但您可以使用 for each 循环迭代起始列表并构建 2D 输出:

list_values=[('BNB', '161221'),
 ('BNB', '171221'),
 ('BNB', '241221'),
 ('BNB', '280122'),
 ('BNB', '311221'),
 ('BTC', '161221'),
 ('BTC', '171221'),
 ('BTC', '241221'),
 ('BTC', '250222'),
 ('BTC', '250322'),
 ('BTC', '280122'),
 ('BTC', '311221')]

key = ''
List_op = []
for lv in list_values:
    if lv[0] != key:            # new key encountered
        if key != '':
            List_op.append(op)  # add previous 1D list to 2D output
        key = lv[0]             # assign new key value
        op = []                 # reinitialize 1D list
    op.append(lv)               # append current tuple to 1D list
List_op.append(op)              # add final 1D list to 2D 

print(List_op)

打印出来:

[[('BNB', '161221'), ('BNB', '171221'), ('BNB', '241221'),
  ('BNB', '280122'), ('BNB', '311221')],
 [('BTC', '161221'), ('BTC', '171221'), ('BTC', '241221'),
  ('BTC', '250222'), ('BTC', '250322'), ('BTC', '280122'),
  ('BTC', '311221')]]

【讨论】:

  • 你能解释一下逻辑吗,输出很好..无法获取方法..
【解决方案3】:

利用第一个元素已排序这一事实,您可以遍历列表并添加新的空列表或将 iem 添加到最后一个子列表,具体取决于您的位置。

out = [[]]
for t in list_values:
    if out[-1] and out[-1][0][0]!=t[0]:
        out.append([])
    out[-1].append(t)
    

输出:

[[('BNB', '161221'),
  ('BNB', '171221'),
  ('BNB', '241221'),
  ('BNB', '280122'),
  ('BNB', '311221')],
 [('BTC', '161221'),
  ('BTC', '171221'),
  ('BTC', '241221'),
  ('BTC', '250222'),
  ('BTC', '250322'),
  ('BTC', '280122'),
  ('BTC', '311221')]]

【讨论】:

  • 它以简单的方式工作......谢谢你
猜你喜欢
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2017-10-01
相关资源
最近更新 更多