【问题标题】:How does one split a list in python knowing a sublist of it? [duplicate]如何在 python 中拆分一个列表,知道它的子列表? [复制]
【发布时间】:2020-04-02 06:06:35
【问题描述】:

我正在寻找一种更有效的方法(如果可用)将列表拆分为两个子列表。 原始列表示例:

full_list = ['t1', 't2', 't3', 't4', 't5', 'v1', 'v2']

注意: 通常原始列表包含任意数量的混合在一起的元素。 't1' ... 't5' 仅用于指示第一个子列表的元素:

t_sub_list = ['t1', 't2', 't3', 't4', 't5']

这个子列表是给定的。

我想最有效地生成第二个子列表:

v_sub_list = ['v1', 'v2']

我想到的解决方案是:

v_sub_list_A = [list_element for list_element in full_list if list_element not in t_sub_list]
v_sub_list_B = list(set(full_list) - set(t_sub_list))

我的问题是 - 有没有更有效的方法来做到这一点? 或者至少是任何可以以代码可读性更强的方式实现结果的包?

【问题讨论】:

  • t_sub_list 总是在full_list 的开头?或者可能在中间?
  • t_sub_list 是 full_list 的随机子集
  • 好的,但是元素是独一无二的?
  • 是的。在我的案例中,元素来自目录列表。因此,作为文件名,它们是唯一的。
  • t_sub_list 中的元素是否是来自 full_list 的连续元素块?还是只是随机数?

标签: python list


【解决方案1】:

如前所述,它比这更容易。由于所有第一个列表元素都在左侧,因此您只需要处理找到断点。使用列表长度。

full_list = ['t1', 't2', 't3', 't4', 't5', 'v1', 'v2']
t_sub_list = ['t1', 't2', 't3', 't4', 't5']

left_size = len(t_sub_list)
v_sub_list = full_list[left_size:]

这会产生您描述的结果。

【讨论】:

  • 正如发布的另一个答案 - 这不会解决一般情况 - 列表元素随机混合。我现在在问题中强调了它,因为它被忽略了。
【解决方案2】:

因为t_sub_list 它并不总是在full_list 的开头,而且你的元素是独一无二的,你可以使用:

full_list = ['t1', 't2', 't3', 't4', 't5', 'v1', 'v2']
t_sub_list = ['t1', 't2', 't3', 't4', 't5']

start_index = full_list.index(t_sub_list[0])
t_size = len(t_sub_list)

v_sub_list = full_list[0:start_index] + full_list[start_index + t_size:]
# ['v1', 'v2']

您正在从t_sub_list 中搜索第一项的索引,然后计算t_sub_list 的大小以获取t_sub_list 周围的所有元素


如果您的t_sub_listfull_list 形式的随机数,您可以使用列表推导:

t_sub_lis = set(t_sub_lis) # will make search O(1)
v_sub_list = [e for e in full_list if e not in t_sub_list]

【讨论】:

  • 请仔细阅读问题。 1. t_sub_list 的元素不一定是连续的块。它们与其他元素随机混合。 2.我在问题本身中发布的列表理解解决方案和集合差异解决方案 - 我问是否有任何其他比这两个更有效/更优雅的解决方案。
  • @glamredhel 我的最后一个解决方案效率更高,因为我在列表理解中使用了一个集合
【解决方案3】:

您可以将 t_sub_list 与您的所有 full_list 进行比较,这样它将拆分 v_sub_list .....

full_list = ['t1', 't2', 't3', 't4', 't5', 'v1', 'v2']
t_sub_list= ['t1', 't2', 't3', 't4', 't5']
v_sub_list=[]

for i in full_list:                 
    if i in t_sub_list:
        pass
    if i not in t_sub_list:
        v_sub_list.append(i)
print(v_sub_list)

输出将是.....

['v1', 'v2']

【讨论】:

  • 这在我的情况下不起作用,因为列表元素是随机混合在一起的。我只强调了分成两个子列表。因此切片无法解决。
  • @glamredhel-我正在编辑代码......现在你可以检查了
  • 问题中已经发布了一个更短的版本:t_A = [list_element for list_element in full_list if list_element not in t_sub_list] 请仔细阅读。
猜你喜欢
  • 2015-12-13
  • 2019-07-18
  • 1970-01-01
  • 2014-10-09
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2021-09-05
相关资源
最近更新 更多