【问题标题】:How to crate multiple lists from another list based on condition/breakpoints in Python?如何根据 Python 中的条件/断点从另一个列表中创建多个列表?
【发布时间】:2019-02-12 00:31:56
【问题描述】:

我正在寻找一种从一个大列表创建多个列表的方法。

我想要做的是过滤掉不同的数字组(每周销售的水果数量)形成一个列表。当每组数字命中指示每组应在何处结束的“******”字符串时,每组数字应位于单独的列表中。

Example list:

['apples', '1000', '2000', '2500', '******', 'oranges', '5000', '150', '******']

到目前为止,我得到了这个:

list = []
for i in mainList:
        if i.isdigit():
            list.append(i)
    print(list)

但是,我的代码将所有内容都打印在一个列表中:

#Ouput = ['1000', '2000', '2500', '5000', '150'] 

如何将输出分成单独的列表,以便将每个水果组打印在单独的“块”中,并且它们都是更大列表的一部分?

我正在寻找的结果应该是这样的:

[['1000', '2000', '2500'], ['5000', '150']]

到目前为止,我已经尝试过:

for i in mainList:
   if '******' in i:
       break
   if i != '******':
       result.append(i)

但这会返回相同的列表,我希望它会在第一个 '******' 断点处中断循环。我正在努力在 '******' 分隔符之后分隔列表的每个部分。

如果能得到任何帮助,我将不胜感激。

【问题讨论】:

  • 您是否打开以水果名称为关键字的字典?
  • 不,我应该为此使用循环。

标签: python python-3.x list


【解决方案1】:

我能想到的最pythonic的方式是使用itertools.groupby

from itertools import  groupby

lst = ['apples', '1000', '2000', '2500', '******', 'oranges', '5000', '150', '******']

result = [list(group) for k, group in  groupby(lst, key=str.isdigit) if k]
print(result)

输出

[['1000', '2000', '2500'], ['5000', '150']]

作为替代方案,您可以使用 for 循环:

result = []
start = True
for element in lst:
    if start and element.isdigit():  # start group
        result.append([element])
        start = False
    elif element.isdigit():  # just append to current group
        result[-1].append(element)
    else:  # close group
        start = True

print(result)

输出

[['1000', '2000', '2500'], ['5000', '150']]

【讨论】:

    【解决方案2】:

    如果您想使用for 循环,如果保证列表具有正确的格式,这将起作用。

    mylist = ['apples', '1000', '2000', '2500', '******', 'oranges', '5000', '150', '******']
    terminator = '******'
    
    result = []
    sublist = []
    for item in mylist:
        if item == terminator:
            result.append(sublist)
            sublist = []
        elif item.isdigit():
            sublist.append(item)
    
    print(result)
    

    打印出来的就是你想要的:

    [['1000', '2000', '2500'], ['5000', '150']]
    

    【讨论】:

    • OP 在他们的例子中跳过了水果名称。
    • 我只想提取数字。像这样:[['1000', '2000', '2500'], ['5000', '150']]
    • 我已经编辑了答案,所以现在只剩下数字了。
    【解决方案3】:

    好吧,试试这个:

    mylst = ['apples', '1000', '2000', '2500', '******', 'oranges', '5000', '150', '******']
    
    finallst = []
    digits = []
    
    for i in mylst:
      if i.isdigit():
        digits.append(i)
      else:
        digits = []
      if digits not in finallst and digits:
        finallst.append(digits)
    
    print(finallst)
    

    我在那里做的是:

    • 获取一个临时列表来存储其中的数字。
    • 获取最终列表并将现有的数字列表附加到 它。
    • 一旦我找到不是 int 的列表元素,我就清空列表,所以 我们可以在下一个元素中重用它。

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 2018-06-20
      • 2023-03-25
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      相关资源
      最近更新 更多