【问题标题】:How to create a function which Iterates over multiple lists如何创建一个迭代多个列表的函数
【发布时间】:2021-05-27 08:27:19
【问题描述】:

所以我正在创建一系列列映射,我可以像这样手动执行此操作

#Produces a list of dictionaries
def create_seed_dict(column, dataset):
    seed_col_vals = dataset[column].values.tolist()
    seed_col_keys =[column] * (len(seed_col_vals))
    seed_col_map = list(zip(seed_col_keys, seed_col_vals))
    seed_dict = []
    for k,v in seed_col_map:
        diction = {}
        diction[k] = v 
        seed_dict.append(diction)
    return seed_dict, seed_col_map

#Create dummy dataframe
num = [1, 2, 3] 
color = ['red', 'white', 'black'] 
value = [255, 256, 257] 
dict = {'Number': num, 'Color': color, 'Score': value}  
df = pd.DataFrame(dict) 

Num_seed_Dict,Num_map = create_seed_dict('Number', df)
print(Num_seed_Dict)
-----------------------------
Out[1]: [{'Number': 1}, {'Number': 2}, {'Number': 3}]

该函数生成一个值及其列的映射。太好了,现在我想让它更通用。

目前,如果我需要映射 2 列,例如,我运行以下命令:

num_vals = df['Number'].values.tolist()
num_keys =['Number'] * (len(num_vals))
num_map = list(zip(num_keys, num_vals))
numDict = []
for k,v in num_map:
    diction = {}
    diction[k] = v 
    numDict.append(diction)
    

color_vals = df['Color'].values.tolist()
color_keys =['Color'] * (len(color_vals))
color_map = list(zip(color_keys, color_vals))
colorDict = []
for k,v in num_map:
    diction = {}
    diction[k] = v 
    colorDict.append(diction)

colorNum_Dict = []
for (f,b) in zip(num_map, color_map):
    diction = {}
    diction[f[0]] = f[1] 
    diction[b[0]] = b[1] 
    colorNum_Dict.append(diction)
    
print(colorNum_Dict)
-----------------------------
[{'Number': 1, 'Color': 'red'}, {'Number': 2, 'Color': 'white'}, {'Number': 3, 'Color': 'black'}]

如果我有很多列,也可以,但不理想。我的问题是如何使第一个函数对超过 1 列有效?

我的主要问题是 for (f,b) in zip(num_map, color_map): 行,我不知道如何动态定义 (f,b..) 以匹配我在 zip 中拥有的 _maps 的数量

【问题讨论】:

    标签: python python-3.x pandas loops for-loop


    【解决方案1】:

    将数据框组合在一起后,您可以使用to_dict 方法获得相同的结果:

    >>> print(df)
       Number  Color  Score
    0       1    red    255
    1       2  white    256
    2       3  black    257
    
    # Select columns, then call `to_dict`
    >>> color_num_records = df[["Number", "Color"]].to_dict("records")
    >>> print(color_num_records)
    [{'Number': 1, 'Color': 'red'}, {'Number': 2, 'Color': 'white'}, {'Number': 3, 'Color': 'black'}]
    

    【讨论】:

      【解决方案2】:

      你只需要在一个元组中接受它们。创建任意数量的变量的 Pythonic 方式是使用序列。 zip 已经为您返回了一个列表。

      a = [1, 2, 3]
      b = [True, False, False]
      c = ['x', 'y', 'z']
      abc = [a, b, c]
      
      for several in zip(*abc):
          print(several)
      

      输出:

      (1, True, 'x')
      (2, False, 'y')
      (3, False, 'z')
      

      此后,您可以使用 len(several) 作为控制值来处理这些项目。如果您想要使用第一个元素作为键,其余作为值:

      diction[several[0]] = lsit(several[1:])
      

      如果您想输入每个元素作为键,其他元素作为值,只需遍历several,使用指示的元素作为键,其他元素作为值。如果您不清楚如何执行此操作,请查看 slice notation,或者如何从序列中删除一个元素。

      【讨论】:

        猜你喜欢
        • 2018-05-20
        • 1970-01-01
        • 2020-05-15
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        相关资源
        最近更新 更多