Вложенный цикл для списка в словаре - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть словарь, который содержит списки в качестве значений:

{
'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) Как реализоватьвложенные в петли?Я пытался использовать такие вещи, как iteritems (), но это не дало удовлетворительных результатов.Что именно должно быть в X и Y "для X в Y" для каждого цикла?

2) Верен ли отступ?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Если вы хотите, чтобы ваш конечный вывод представлял собой фрейм данных, я бы посоветовал вам использовать функции panda, которые могут сами обрабатывать циклы и выполнять регулярные выражения без необходимости в циклах.Вот пример:

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'}}
'''

Чтобы ответить на ваши 2 вопроса:

  • Цикл над словарем может выглядеть примерно так (предположим, для python3):
    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

Некоторые ссылки на документацию:

Надеюсь, это поможет!

0 голосов
/ 28 февраля 2019

Если вы можете использовать следующий 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']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...