我正在尝试从列表列表中的数据创建数组。
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('')
答案 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)