我有一个包含列表作为值的字典:
{
'List1' : ['Value1', 'Value2', 'Value3'],
'List2' : ['Value1', 'Value2', 'Value3'],
'List3' : ['Value1', 'Value2', 'Value3'],
}
我想遍历每个列表的值以查找正则表达式,然后创建一个包含这些正则表达式的字典。也就是说,对于我的初始词典的每个列表。我的列表中的每个迭代(在前面的示例中为3)都会创建1行(因此总共3行),因此我将运行代码以编写完整的唯一行。
不确定是否清楚,但是看起来应该类似于:
for list in dictionary:
for value in list:
column_list_A = []
if re.search(regex, value):
column_list_A.append(regex, value).group(1)
column_list_B = []
if re.search(regex, value):
column_list_B.append(regex, value).group(1)
New_Dictionary = {"column_list_A" : column_list_A, "column_list_B" : column_list_B}
Df = pd.DataFrame.from_dict(New_Dictionary)
for column in Df:
#Code that puts the values of the 3 rows into 1 row
输出应如下所示:
| Column_list_A | Column_list_B
----------------------------------------------------
List1 | match object | match object
----------------------------------------------------
List2 | match object | match object
----------------------------------------------------
List3 | match object | match object
我的问题是:
1)如何实现嵌套的for循环?我已经尝试过使用iteritems()之类的方法,但结果却不令人满意。对于每个循环,X和Y到底应位于“对于Y中的X”中是什么?
2)缩进正确吗?
答案 0 :(得分:1)
如果您希望最终输出为数据帧,我建议您使用熊猫函数,它们可以很好地自己处理循环和正则表达式,而无需for循环。这是一个示例:
import pandas as pd
# read dict in the right orientation
df = pd.DataFrame.from_dict(dictionary, orient="index")
''' # your df will look like this:
>>> df
0 1 2
List1 Value1 Value2 Value3
List2 Value1 Value2 Value3
List3 Value1 Value2 Value3
'''
# append your regex matches to the dataframe
# e.g. match any of (d,e) followed by a digit
df["match_from_column_0"] = df[0].str.extract(r'([de]\d)')
# e.g. match a digit
df["match_from_column_1"] = df[1].str.extract(r'(\d)')
# save your output as a dataframe
output = df[["match_from_column_0","match_from_column_1"]]
''' # output will look like this:
>>> output
match_from_column_0 match_from_column_1
List1 e1 2
List2 e1 2
List3 e1 2
'''
# or a dict
output_dict = output.to_dict()
'''
>>> output_dict
{'output1': {'List1': 'e1', 'List2': 'e1', 'List3': 'e1'},
'output2': {'List1': 'e2', 'List2': 'e2', 'List3': 'e2'}}
'''
要解决您的两个问题:
for dict_key, dict_value in dictionary.items():
# do whatever
for value in my_list:
# do whatever
您的第3-8行应缩排(从第二秒开始,循环缩进4个空格)
以您自己的方式进行操作(我认为是更困难的方式),这是一个建议(if语句应该需要else子句+追加空字符串,因为它们将导致您的列表长度不相等?) :
import re
for key, list_of_values in dictionary.items():
for value in list_of_values:
column_list_A = []
if re.search(regex, value):
column_list_A.append(re.search(regex, value).group(0))
else:
column_list_A.append("")
column_list_B = []
if re.search(regex, value):
column_list_B.append(re.search(regex, value).group(0))
else:
column_list_B.append("")
New_Dictionary = {"column_list_A" : column_list_A, "column_list_B" : column_list_B}
Df = pd.DataFrame.from_dict(New_Dictionary)
for column in Df:
# do your thing
一些参考文档:
希望有帮助!
答案 1 :(得分:0)
如果可以使用以下dictcomp:
import re
from pprint import pprint
d = {
'List1' : ['Value1', 'Value2', 'Value3'],
'List2' : ['Value1', 'Value2', 'Value3'],
'List3' : ['Value1', 'Value2', 'Value3'],
}
col = ["column_list_A", "column_list_B", "column_list_C"]
def func(a, b, c):
a = re.match(r'Val(ue\d)', a).group(1)
b = re.match(r'Valu(e\d)', b).group(1)
c = re.match(r'Value(\d)', c).group(1)
return [a, b, c]
new_d = {i: func(*j) for i, *j in zip(col, *d.values())}
pprint(new_d)
输出:
{'column_list_A': ['ue1', 'e1', '1'],
'column_list_B': ['ue2', 'e2', '2'],
'column_list_C': ['ue3', 'e3', '3']}