簡體   English   中英

給定分組元素列表時,查找 hash 的所有可能排列

[英]Finding all possible permutations of a hash when given list of grouped elements

展示我正在嘗試做的事情的最佳方式:我有一個由有序元素組成的不同哈希列表,由下划線分隔。 每個元素可能有也可能沒有其他可能的替換值。 在考慮替換值后,我正在嘗試生成此 hash 的所有可能組合的列表。

示例:grouped_elements = [["1", "1a", "1b"], ["3", "3a"]] original_hash = "1_2_3_4_5"

我希望能夠生成以下哈希列表:

[
 "1_2_3_4_5",
 "1a_2_3_4_5",
 "1b_2_3_4_5",
 "1_2_3a_4_5",
 "1a_2_3a_4_5",
 "1b_2_3a_4_5",
]

挑戰在於大型數據幀需要這樣做。

到目前為止,這就是我所擁有的:

def return_all_possible_hashes(df, grouped_elements)
    rows_to_append = []
    for grouped_element in grouped_elements:
        for index, row in enriched_routes[
            df["hash"].str.contains("|".join(grouped_element))
        ].iterrows():
            (element_used_in_hash,) = set(grouped_element) & set(row["hash"].split("_"))
            hash_used = row["hash"]
            replacement_elements = set(grouped_element) - set([element_used_in_hash])
            for replacement_element in replacement_elements:
                row["hash"] = stop_hash_used.replace(
                    element_used_in_hash, replacement_element
                )
                rows_to_append.append(row)

    return df.append(rows_to_append)

但問題是,這只會 append 散列與給定 grouped_element 的所有組合,而不是同時所有 grouped_elements 的所有組合。 所以使用上面的例子,我的 function 會返回:

[
 "1_2_3_4_5",
 "1a_2_3_4_5",
 "1b_2_3_4_5",
 "1_2_3a_4_5",
]

我覺得我離解決方案不遠了,但我也覺得卡住了,所以非常感謝任何幫助!

如果您列出原始 hash 值的元素並用所有可能變化的列表替換每個元素,則可以使用itertools.product跨這些子列表獲取笛卡爾積。 使用'_'.join()將結果的每個元素轉換回字符串將為您提供可能的哈希列表:

from itertools import product


def possible_hashes(original_hash, grouped_elements):
    
    hash_list = original_hash.split('_')
    variations = list(set().union(*grouped_elements))
    
    var_list = hash_list.copy()
    for i, h in enumerate(hash_list):
        if h in variations:
            for g in grouped_elements:
                if h in g:
                    var_list[i] = g
                    break
        else:
            var_list[i] = [h]
                    
    return ['_'.join(h) for h in product(*var_list)]


possible_hashes("1_2_3_4_5", [["1", "1a", "1b"], ["3", "3a"]]) 
['1_2_3_4_5',
 '1_2_3a_4_5',
 '1a_2_3_4_5',
 '1a_2_3a_4_5',
 '1b_2_3_4_5',
 '1b_2_3a_4_5']

要在存儲在 dataframe 列中的各種原始 hash 值上使用此 function,您可以執行以下操作:

df['hash'].apply(lambda x: possible_hashes(x, grouped_elements))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM