抱歉,如果这不是很清楚,这是我第一次在这里问问题,所以我希望我能正确地解释我的问题.

我有以下具有不同值的列表:

A_list = ['A', 'A', 'B', ['C', 'D'] ]
B_list = ['A1', 'W5', 'X6', 'A2', 'A3', 'T5', 'B0', 'Z9', 'C1', 'W3', 'D1']
C_list = []
string_list = ["{0} in Alpha", "{0} in Apple", "{0} in Bee", "{0} in Cheese and {1} in Dice"]

我需要在B_LIST中找到A_LIST的元素,将它们附加到C_LIST中,并使输出是带有C_LIST中的元素的STRING_LIST中的格式化字符串.

因此,在B_list中寻找A_list[i]之后,C_list最终会是这样的:

C_list = ['A1', 'A2', 'A3', 'B0', ['C1', 'D1'] ]

输出结果如下所示:

A1 in Alpha,
A1 in Apple,
A2 in Alpha,
A2 in Apple,
A3 in Alpha,
A3 in Apple,
B0 in Bee,
C1 in Cheese and D1 in Dice

我一直在绞尽脑汁地处理嵌套列表,并以类似于A_List的顺序排列它们,以便能够用以下内容格式化输出:

output = string_list[i].format(*C_list[i]) // just an example

我一直试图通过混合使用for循环和if语句来解决这个问题. 我可以在一个简单的for循环中搜索B_listA_list的元素:

for a in A_list:
    for b in B_list:
        if a in b:
            print(str(a) + " found in " + str(b))

最让我头疼的是如何将找到的B_LIST元素添加到与A_LIST类似的格式中,这样我就可以得到

C_list = ['A1', 'A2', 'A3', 'B0', ['C1', 'D1']]

但不是这样的:

C_list = ['A1', 'A2', 'A3', 'B0', 'C1', 'D1']

推荐答案

Part 1: getting C_list

您必须自己创建嵌套列表以附加到C_LIST. 如果中的项既可以是字符串列表,也可以是字符串,则有2个 case .

def get_A_in_B(a_list:"list[str|list[str]]",b_list:"list[str]"):
    c_list = [] # global within this function     
    
    # for neatness   
    def process_base_item(a_str:"str",out_list:"list"):
        matches = sorted([b_str for b_str in b_list if b_str.startswith(a_str)])
        out_list.extend(matches)
    
    for a_item in a_list: # case 1 - is list, extend nested
        if type(a_item) is list:
            sublist = a_item
            nested_list = []
            for sub_item in sublist:
                process_base_item(sub_item,nested_list)
            if nested_list:
                c_list.append(nested_list)
        else: # case 2 - is string, extend c list
            process_base_item(a_item,c_list)
    return c_list

用途:

A_list = ['A', 'B', ['C', 'D'] ]
B_list = ['A1', 'W5', 'X6', 'A2', 'A3', 'T5', 'B0', 'Z9', 'C1', 'W3', 'D1']
C_list = get_A_in_B(A_list,B_list,string_list)

输出:

['A1', 'A2', 'A3', 'B0', ['C1', 'D1']]

Part 2: formatting

如果支持两个假设,这将是可行的:

  1. 假设格式字符串中每种类型的字母只有one
  2. 假设如果您想循环通过all possibilities,如果嵌套是不均匀的 例如:["c1","c2","d1"]=>;"c1"+"d1","c2"+"d1"

这才是真正棘手的部分.我使用正则表达式将字母与格式字符串进行匹配.

对于C_list的嵌套列表,我按照它们的字母将它们拆分成更多的子列表,然后让它们的cartesian product作为格式字符串的多个参数输入.

和以前一样,你有两个箱子.

def format_string_list(c_list,string_list):
    formatted_string_list = []
    for c_item in c_list:
        for fmt_str in string_list:
            if type(c_item) is list: # case 1 - is list, match multiple
                c_sublist = c_item
                # assumption 1: letters are unique
                first_letters = sorted(set([c_str[0] for c_str in c_sublist]))
                matched_letters = []
                for letter in first_letters:
                    pat = f" in {letter}"
                    if pat in fmt_str:
                        matched_letters.append(letter)
                        
                if first_letters==matched_letters: 
                    # get dictionary of lists, indexed by first letter
                    c_str_d = {}
                    for letter in first_letters:
                        c_str_d[letter] = [c_str for c_str in c_sublist if letter in c_str]
                    
                    # assumption 2: get all combinations
                    for c_str_list in itertools.product(*c_str_d.values()):
                        c_fmtted = fmt_str.format(*c_str_list)
                        formatted_string_list.append(c_fmtted) 
            else: # case 2
                c_str = c_item
                first_letter = c_str[0]
                pat = f" in {first_letter}"

                if pat in fmt_str:
                    c_fmtted = fmt_str.format(c_str)
                    formatted_string_list.append(c_fmtted)
    
    return formatted_string_list

用途:

C_list = ['A1', 'A2', 'A3', 'B0', ['C1', 'D1'] ]
string_list = ["{0} in Alpha", "{0} in Apple", "{0} in Bee", "{0} in Cheese and {1} in Dice"]
formatted_string_list = format_string_list(C_list,string_list)
# print output
print("\n".join(formatted_string_list))

输出:

A1 in Alpha
A1 in Apple
A2 in Alpha
A2 in Apple
A3 in Alpha
A3 in Apple
B0 in Bee
C1 in Cheese and D1 in Dice

works on more complex cases too

不会超出一个级别的嵌套,不要认为您的情况需要它

A_list = ['A', 'B', ['C', 'D', 'E']]
B_list = ['A1', 'W5', 'X6', 'D2', 'E1', 'A2', 'A3', 'T5', 'E2', 'B0', 'Z9', 'C1', 'W3', 'D1']
string_list = ["{0} in Alpha", "{0} in Apple", "{0} in Bee", "{0} in Cheese and {1} in Dice {2} in Egg"]

输出:

['A1', 'A2', 'A3', 'B0', ['C1', 'D1', 'D2', 'E1', 'E2']]
A1 in Alpha
A1 in Apple
A2 in Alpha
A2 in Apple
A3 in Alpha
A3 in Apple
B0 in Bee
C1 in Cheese and D1 in Dice E1 in Egg
C1 in Cheese and D1 in Dice E2 in Egg
C1 in Cheese and D2 in Dice E1 in Egg
C1 in Cheese and D2 in Dice E2 in Egg

Python相关问答推荐

数字梯度的意外值

在for循环中仅执行一次此操作

Python中的负前瞻性regex遇到麻烦

如何处理嵌套的SON?

优化在numpy数组中非零值周围创建缓冲区的函数的性能

acme错误-Veritas错误:模块收件箱没有属性linear_util'

Pandas 都是(),但有一个门槛

用合并列替换现有列并重命名

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

numpy卷积与有效

OR—Tools中CP—SAT求解器的IntVar设置值

将tdqm与cx.Oracle查询集成

当点击tkinter菜单而不是菜单选项时,如何执行命令?

如何使用正则表达式修改toml文件中指定字段中的参数值

不允许 Select 北极滚动?

Beautifulsoup:遍历一个列表,从a到z,并解析数据,以便将其存储在pdf中.

每次查询的流通股数量

PySpark:如何最有效地读取不同列位置的多个CSV文件

如何从数据框列中提取特定部分并将该值填充到其他列中?

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用