从一个lis创建可变长度的列表

2024-06-06 19:30:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一个列表创建多个列表。根据是否有来自用户的数据,列表将有1个值或3个值。但是,由于数据是附加到特定用户的,因此必须保持顺序。你知道吗

例如:

data = ['no data', 'choice 1', 'choice 4', 'choice 2', 'no data', 'choice 1', ...etc]

我希望输出为:

list1 = ['no data']
list2 = ['choice 1', 'choice4', 'choice 2']
list3 = ['no data']
list4 = ['choice 1'...]

我该如何做到这一点?你知道吗


Tags: 数据no用户列表data顺序etcchoice
2条回答

这似乎是工作,是相当容易理解。它不创建单独的变量,而是创建一个名为lists的列表。你知道吗

data = ['no data', 'choice 1', 'choice 4', 'choice 2', 'no data', 'choice 1', '...etc']

lists = []
tmp = []
for elem in data:
    if elem != 'no data':
        tmp.append(elem)
    else:
        if tmp:
            lists.append(tmp)
        lists.append([elem])
        tmp = []

if tmp:
    lists.append(tmp)

for i, sublist in enumerate(lists, start=1):
    print('list{}: {}'.format(i, sublist))

输出:

list1: ['no data']
list2: ['choice 1', 'choice 4', 'choice 2']
list3: ['no data']
list4: ['choice 1', '...etc']

不幸的是,如果需要将非“no-data”的运行分块成3组,或者作为每个'no-data'的singleton,那么itertools.groupby就不起作用。所以,这里有一些其他的东西:

In [40]: def group_lists(data):
    ...:     final = []
    ...:     contains_data = False
    ...:     temp = []
    ...:     for sub in data:
    ...:         if sub == 'no data':
    ...:             if contains_data:
    ...:                 final.append(temp)
    ...:                 temp = []
    ...:                 final.append([sub])
    ...:                 contains_data = False
    ...:             else:
    ...:                 final.append([sub])
    ...:         else:
    ...:             contains_data = True
    ...:             if len(temp) < 3:
    ...:                 temp.append(sub)
    ...:             else:
    ...:                 final.append(temp)
    ...:                 temp = []
    ...:                 contains_data = False
    ...:     return final
    ...:

In [41]: data = ['choice 1', 'choice 2', 'choice 1', 'choice 1', 'choice 4', 'choice 1', 'no data']

In [42]: group_lists(data)
Out[42]: [['choice 1', 'choice 2', 'choice 1'], ['choice 4', 'choice 1'], ['no data']]

In [43]: data2 = ['choice 1', 'choice 2', 'choice 1', 'choice 1', 'choice 4', 'choice 1', 'choice1', 'no data']

In [44]: group_lists(data2)
Out[44]:
[['choice 1', 'choice 2', 'choice 1'],
 ['choice 4', 'choice 1', 'choice1'],
 ['no data']]

原始答案

使用^{}

In [15]: data = ['no data', 'choice 1', 'choice 4', 'choice 2', 'no data', 'choice 1']
    ...:

In [16]: import itertools

In [17]: grouped = [list(g) for _, g in itertools.groupby(data, lambda s: s == 'no data')]

In [18]: grouped[0]
Out[18]: ['no data']

In [19]: grouped[1]
Out[19]: ['choice 1', 'choice 4', 'choice 2']

In [20]: grouped[2]
Out[20]: ['no data']

In [21]: grouped[3]
Out[21]: ['choice 1']

打开相当笨重的一个衬垫:

In [26]: lists = []
    ...: for _, g in itertools.groupby(data, lambda s: s == 'no data'):
    ...:     lists.append(list(g))
    ...:

In [27]: lists[0]
Out[27]: ['no data']

In [28]: lists[1]
Out[28]: ['choice 1', 'choice 4', 'choice 2']

In [29]: lists[2]
Out[29]: ['no data']

In [30]: lists[3]
Out[30]: ['choice 1']

因此,结果是一个列表列表:

In [32]: lists
Out[32]: [['no data'], ['choice 1', 'choice 4', 'choice 2'], ['no data'], ['choice 1']]

相关问题 更多 >