从列表列表中的项目形成数组

时间:2018-06-16 07:57:23

标签: python python-3.x list loops

我正在尝试从列表列表中的数据创建数组。

ac_name = 'ac'
dat = [['ab=55', 'ac=25', 'db =57', 'dc =44'],
       ['ab=75','ac =12', 'cg =11', 'pt =95'],
       ['ab=17', 'ac=62'],
       ['ab=97', 'aa=501', 'dc=12', 'dd=19']]

所以我想得到一个看起来像这样的列表

ac = ['ac=25','ac=12','ac=62','']

从此获取

ac_values = [25,12,62,'']

总而言之,我想将dat转换为一个大型数组。

我知道这不起作用,因为它遍历每个项目,因此输出是dat中的许多元素。

ac = []
for d in dat:
    for c in d:
        if ac_name in c:
            ac.append(c)
        else:
            ac.append('')

7 个答案:

答案 0 :(得分:2)

正如我在评论中提到的,您的else块位于嵌套循环内,这意味着如果条件未执行,则每个列表中的所有项目都将为空字符串。您可以使用标志来查看if块是否在嵌套循环中执行,并将空字符串附加到最终结果。

In [6]: ac = []
   ...: for d in dat:
   ...:     flag = True
   ...:     for c in d:
   ...:         if ac_name in c:
   ...:             ac.append(c)
   ...:             flag = False
   ...:     if flag:
   ...:         ac.append('')
   ...:         

In [7]: ac
Out[7]: ['ac=25', 'ac =12', 'ac=62', '']

但是因为这不是处理问题的Pythonic方法,所以你可以使用生成器表达式和next()函数如下来创建一个超出预期结果的字典。在这种情况下,您也可以轻松访问键或值。

In [19]: result = dict((ind, next((i for i in d if i.startswith(ac_name)), '=').split('=')[1]) for ind, d in enumerate(dat))

In [20]: result
Out[20]: {0: '25', 1: '12', 2: '62', 3: ''}

In [21]: result.keys() # shows number of sub-lists in your original list
Out[21]: dict_keys([0, 1, 2, 3])

In [22]: result.values()
Out[22]: dict_values(['25', '12', '62', ''])

答案 1 :(得分:1)

ac_name = 'ac'
datas = [['ab=55', 'ac=25', 'db =57', 'dc =44'],
    ['ab=75','ac =12', 'cg =11', 'pt =95'],
    ['ab=17', 'ac=62'],
    ['ab=97', 'aa=501', 'dc=12', 'dd=19'],
    ['ab=55', 'ac=25', 'db =57', 'dc =44'],
    ['ab=75','ac =12', 'cg =11', 'pt =95'],
    ['ab=17', 'ac=62'],
    ['ab=97', 'aa=501', 'dc=12', 'dd=19']]

lst = []

for i,data in enumerate(datas):
    for d in data:
        if ac_name in d:
            lst.append(d.split('=')[-1])
    if i == len(lst):
        lst.append('')

print(lst)

<强>输出

['25', '12', '62', '', '25', '12', '62', '']

答案 2 :(得分:1)

您可以使用itertools.chain展平您的列表列表。然后使用列表推导来根据需要过滤和拆分元素。

from itertools import chain

res = [int(i.split('=')[-1]) for i in chain.from_iterable(dat) \
       if i.startswith('ac')]

print(res)

[25, 12, 62]

答案 3 :(得分:0)

人们已经表明,有很多方法可以做到这一点。以下是使用列表推导和高阶函数的一种方法:

$date = Carbon::parse(now())->format('Y.m.d');
$time = Carbon::parse(now())->format('H:i:s');

如果确切的密钥&#34; ac&#34;是理想的,也可以使用正则表达式:

In [14]: ["" if not kv else kv[0].split('=')[-1].strip() for kv in  [filter(lambda x: x.startswith(ac_name), xs) for xs in datas]]
Out[14]: ['25', '12', '62', '']

答案 4 :(得分:0)

经过一番疑惑,我找到了一个可能的解决方案

单独处理每个子列表中的每个元素:如果它包含'ac',则剥离'ac ='部分。如果没有,只需返回一个空字符串''。 然后使用string.join()连接每个子列表中的所有元素。这将返回一个带有数字字符串的字符串列表,例如'25',或空字符串。 最后,如果可能,有条件地将每个字符串转换为整数。否则只返回(空)字符串。

ac = [int(cell_string) if cell_string.isdigit() else cell_string for cell_string in
      [''.join([cell.split('=')[1] if ac_name in cell else '' for cell in row]) for row in data]]

输出:

[25, 12, 62, '']

编辑: 如果要将其扩展为多个列名,例如:

col_name = ['ac', 'dc']

然后扩展一下:

cols = [[int(cell_string) if cell_string.isdigit() else cell_string for cell_string in
         [''.join([cell.split('=')[1] if name in cell else '' for cell in row]) for row in data]] for name in col_name]

输出:

[[25, 12, 62, ''], [44, '', '', 12]]

答案 5 :(得分:0)

尝试一下:

ac_name = 'ac'
ac = []
ac_values = []

for value in dat:
    found = False
    for item in value:
        if ac_name in item:
            ac.append(item)
            ac_values.append(item.split('=')[-1])
            found = True
    if not found:
        ac.append(' ')
        ac_values.append(' ')

print(ac)
print(ac_values)

输出:

['ac= 25', 'ac = 12', 'ac=62', ' ']
[' 25', ' 12', '62', ' ']

答案 6 :(得分:-1)

这适用于任何长度的ac_name

ac_name = 'ac'
ac = []
ac_values=[]
for i in dat:
    found=False
    for j in i:
        if j[:2]==ac_name:
            ac.append(j)
            ac_values.append(int(j[len(ac_name)+2:]))
            found=True
    if not found:
        ac.append("")
        ac_values.append("")
print(ac)
print(ac_values)