【问题标题】:Create list of lists containing tuples at start and end of sublist在子列表的开头和结尾创建包含元组的列表列表
【发布时间】:2018-10-24 10:10:17
【问题描述】:

我有一个类似这样的扁平化列表

l = [(2.0000001192092896, 3.3999999761581421), [4, 3], (1.9999999701976776, 1.7999999821186066), (0.875, 1.125), [-1, 0], [-1, 4], (1.5, 3.5)].

我想在开头和结尾创建一个包含元组的列表列表,如下所示:

l' = [[(2.0000001192092896, 3.3999999761581421), [4, 3], (1.9999999701976776, 1.7999999821186066)],[(1.9999999701976776, 1.7999999821186066),(0.875, 1.125)], [(0.875, 1.125), [-1, 0], [-1, 4], (1.5, 3.5)],[(1.5, 3.5),(2.0000001192092896, 3.3999999761581421)]]

l' 包含所有元组以及它们之间的列表(如果有)。

我尝试使用以下代码执行相同的操作,但无法成功实现:

full_list = []
state = 0
for ind,value in enumerate(l):
    if isinstance(value, tuple):
        if state == 0:
            state = 1
            inner_list = []
            if ind == len(l) - 1:
                k = 0
            else:
                k = ind + 1
            j = l[k]
            if isinstance(j,tuple):
                full_list.append(inner_list)
                inner_list.append(j)
        else:
            state = 0 
    inner_list.append(value)     

print(full_list)   

有人可以提出其他替代方案吗?

【问题讨论】:

  • 不清楚你在问什么。你想在开始和结束时使用哪些元组?它们之间会出现哪些列表? l' 中的第二个列表中没有列表,而其中的第三个列表在开始和结束元组之间有两个列表。

标签: python python-2.7 list tuples


【解决方案1】:

这似乎清理了一些东西。不需要检查它是否是一个列表,因为这种方式也只有元组和列表。

l = [(2.0000001192092896, 3.3999999761581421), [4, 3], (1.9999999701976776, 1.7999999821186066), (0.875, 1.125), [-1, 0], [-1, 4], (1.5, 3.5)]
full_list = []
inner_list = []
for value in l:
    if isinstance(value, tuple):
        inner_list.append(value)
        if len(inner_list) > 0:
            full_list.append(inner_list)
            inner_list = []
    else:
        inner_list.append(value)

print(full_list)

这将打印:

[[(2.0000001192092896, 3.399999976158142), [4, 3], (1.9999999701976776, 1.7999999821186066)], [(0.875, 1.125), [-1, 0], [-1, 4], (1.5, 3.5)]]

【讨论】:

  • 在这种情况下我是什么?
  • 应该是inner_list 谢谢提问!编辑了我的答案
  • 感谢您的回答,但我想要一个类似 l' 的列表,您的代码给出的列表是我已经拥有的。
  • 我的代码中的另一个错误类型。在附加到 full_list 和重置 inner_list 之前,我忘记将值附加到 inner_list。编辑了我的答案
【解决方案2】:

获取存在tuples 的索引,然后获取zip 它们并使用列表理解:

tup_index = [index for index,value in enumerate(l) if isinstance(value,tuple)]
full_list = [l[first:last+1] for first,last in zip(tup_index[::2],tup_index[1::2])]

print(full_list)

[[(2.0000001192092896, 3.399999976158142),[4, 3],(1.9999999701976776, 1.7999999821186066)],
 [(0.875, 1.125), [-1, 0], [-1, 4], (1.5, 3.5)]]

或者如果列表包含奇数个元组,则:

if len(tup_index)%2==0:
    full_list = [l[first:last+1] for first,last in zip(tup_index[::2],tup_index[1::2])]
else:
    tup_index.append(len(l)+1)
    full_list = [l[first:last+1] for first,last in zip(tup_index[::2],tup_index[1::2])]

【讨论】:

  • Sandeep 感谢您的回答,但我没有得到像 l' 这样的列表。这个列表是我已经拥有的。
  • @AshutoshMishra ' 是用于字符串的特殊字符。所以,你永远不会有一个名为l' 的变量。尝试不同的命名约定。谢谢。
  • 我的意思是说我想要问题中提到的另一个列表。
  • 还是一样!!
  • @AshutoshMishra 输出包含主列表中每个列表的开头和结尾的元组。
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2011-07-13
  • 2022-01-08
相关资源
最近更新 更多