使用python中另一个列表的内容重新排列列表

使用python中另一个列表的内容重新排列列表,python,string,Python,String,我有两张单子 list_a = ['an378j', 'an378jijm', 'fg453h', 'fg453hbrd'] list_b = ['fg453h2564677sakjh', 'an378jijm564456464ewf', 'fg453hbrd8968764ewf', 'an378j86764edwf'] 注意:列表列表a的前几个字符与列表列表b的前几个字符相同 我需要根据顺序重新排列ListList\u b,匹配的字符被放置在ListList\u a中 因此,新的清单应该是

我有两张单子

list_a = ['an378j', 'an378jijm', 'fg453h', 'fg453hbrd']

list_b = ['fg453h2564677sakjh', 'an378jijm564456464ewf', 'fg453hbrd8968764ewf', 'an378j86764edwf']
注意:列表
列表a
的前几个字符与列表
列表b
的前几个字符相同

我需要根据顺序重新排列List
List\u b
,匹配的字符被放置在List
List\u a

因此,新的清单应该是:

['an378j86764edwf', 'an378jijm564456464ewf', 'fg453h2564677sakjh', 'fg453hbrd8968764ewf']
我的解决方案:

A = ['an378j', 'an378jijm', 'fg453h', 'fg453hbrd']

B = ['fg453h2564677sakjh', 'an378jijm564456464ewf', 'fg453hbrd8968764ewf', 'an378j86764edwf']

tmp_A = A.copy()

def get_pair(b_val):
    # All possible pairs from A for b_el:
    possible_pairs = [val for i, val in enumerate(tmp_A) if b_val.startswith(val)]
    # Longest of possible pairs is pair we should use:
    pair = sorted(possible_pairs, key=len, reverse=True)[0]
    # Pair we use can't be used again:
    tmp_A.pop(tmp_A.index(pair))
    # Return:
    return pair

# Index of pair is key to sort:
res = sorted(B, key=lambda b_val: A.index(get_pair(b_val)))
print(res)
# ['an378j86764edwf', 'an378jijm564456464ewf', 'fg453h2564677sakjh', 'fg453hbrd8968764ewf']
对于不同的输入:

A = ['an378j', 'an378jijm', 'fg453h', 'fg453hbrd', 'an']

B = ['fg453h2564677sakjh', 'an378jijm564456464ewf', 'fg453hbrd8968764ewf', 'an378j86764edwf', 'an378j']

# ['an378j86764edwf', 'an378jijm564456464ewf', 'fg453h2564677sakjh', 'fg453hbrd8968764ewf', 'an378j']
我的解决方案:

A = ['an378j', 'an378jijm', 'fg453h', 'fg453hbrd']

B = ['fg453h2564677sakjh', 'an378jijm564456464ewf', 'fg453hbrd8968764ewf', 'an378j86764edwf']

tmp_A = A.copy()

def get_pair(b_val):
    # All possible pairs from A for b_el:
    possible_pairs = [val for i, val in enumerate(tmp_A) if b_val.startswith(val)]
    # Longest of possible pairs is pair we should use:
    pair = sorted(possible_pairs, key=len, reverse=True)[0]
    # Pair we use can't be used again:
    tmp_A.pop(tmp_A.index(pair))
    # Return:
    return pair

# Index of pair is key to sort:
res = sorted(B, key=lambda b_val: A.index(get_pair(b_val)))
print(res)
# ['an378j86764edwf', 'an378jijm564456464ewf', 'fg453h2564677sakjh', 'fg453hbrd8968764ewf']
对于不同的输入:

A = ['an378j', 'an378jijm', 'fg453h', 'fg453hbrd', 'an']

B = ['fg453h2564677sakjh', 'an378jijm564456464ewf', 'fg453hbrd8968764ewf', 'an378j86764edwf', 'an378j']

# ['an378j86764edwf', 'an378jijm564456464ewf', 'fg453h2564677sakjh', 'fg453hbrd8968764ewf', 'an378j']

非常详细,但它做你想要的

list_a = ['an378j', 'an378jijm', 'fg453h', 'fg453hbrd']
list_b = ['fg453h2564677sakjh', 'an378jijm564456464ewf', 'fg453hbrd8968764ewf', 'an378j86764edwf']

sorted_b = []
grouped_b = {}
for item_a in list_a:
    for item_b in list_b:
        if item_b.startswith(item_a):
            if item_a not in grouped_b:
                grouped_b[item_a] = [item_b]
            else:
                grouped_b[item_a].append(item_b)

    for item in sorted(grouped_b[item_a]):
        if item not in sorted_b:
            sorted_b.append(item)

print sorted_b
['an378j86764edwf'、'AN378JIJM5644564464EWF'、'FG453H256677SAKJH', 'fg453hbrd8968764ewf']


非常详细,但它做你想要的

list_a = ['an378j', 'an378jijm', 'fg453h', 'fg453hbrd']
list_b = ['fg453h2564677sakjh', 'an378jijm564456464ewf', 'fg453hbrd8968764ewf', 'an378j86764edwf']

sorted_b = []
grouped_b = {}
for item_a in list_a:
    for item_b in list_b:
        if item_b.startswith(item_a):
            if item_a not in grouped_b:
                grouped_b[item_a] = [item_b]
            else:
                grouped_b[item_a].append(item_b)

    for item in sorted(grouped_b[item_a]):
        if item not in sorted_b:
            sorted_b.append(item)

print sorted_b
['an378j86764edwf'、'AN378JIJM5644564464EWF'、'FG453H256677SAKJH', 'fg453hbrd8968764ewf']


列表中的元素是字符串吗?你试过什么吗?问题比看起来更有趣:简单的
排序(B,key=lambda el:next(i代表i,v在枚举(A)中,如果el.startswith(v))
不起作用,因为
an378j
使用了两次,而
an378jijm
从不。看看
过滤器(startswith,B)
在对
a
@Brad的理解中。请修正您的问题以指示字符串。现在你有变量名或者只是语法无效。列表中的元素是字符串吗?你尝试过什么吗?问题比看起来更有趣:简单的
排序(B,key=lambda el:next(如果el.startswith(v))
不起作用,因为
an378j
使用了两次,而
an378jijm
从不。在理解
a
@Brad时,查看
过滤器(startswith,B)
。请修正您的问题以指示字符串。现在您有变量名或语法无效。您的解决方案无法处理此数据:
A=['an378j','an378jijm','fg453h','fg453hbrd','an']
<代码>B=['FG453H256677SAKJH','AN378JIJM5644564464EWF','fg453hbrd8968764ewf','an378j86764edwf','an378j'];输出:
['an378j'、'an378j86764edwf'、'AN378JIJM5644564464EWF'、'FG453H256677SAKJH'、'fg453hbrd8968764ewf']
-查看最后一个元素。谢谢大家。给出的解决方案非常有效。您的解决方案不适用于此数据:
a=['an378j','an378jijm','fg453h','fg453hbrd','an']
<代码>B=['FG453H256677SAKJH','AN378JIJM5644564464EWF','fg453hbrd8968764ewf','an378j86764edwf','an378j'];输出:
['an378j'、'an378j86764edwf'、'AN378JIJM5644564464EWF'、'FG453H256677SAKJH'、'fg453hbrd8968764ewf']
-查看最后一个元素。谢谢大家。给出的解决方案非常有效。