【问题标题】:Python for loop to manipulate list and remove elements once usedPython for 循环操作列表并删除使用过的元素
【发布时间】:2019-04-09 09:25:06
【问题描述】:

我有一个列表列表,我需要将第二个和第三个元素分别移动到第一个和最后一个位置的第一个元素(这是一个列表)中。然后我需要删除使用过的元素。

我已经有一个 for 循环可以在第一个实例中使用,但我不确定如何安全地删除这些元素并移至下一组并重复操作。我了解 for 循环不适合删除元素。

示例列表

x = ['string 1', 1, 2, 'string 2', 0, 'string 3'], 'new string 1', 'new string 2', ['string 3', 19, 2, 'string 4', 0, 'string 5'], 'new string 3', 'new string 4', ['string 6', 1, 2, 'string 7', 0, 'string 8'], 'new string 5', 'new string 6', ['string 9', 19, 2, 'string 10', 0, 'string 11']

new string 1 应该放在 string 1 前面,new string 2 被附加到列表中,然后所有前 10 个值(技术上前 3 个元素,因为第一个是一个列表)被删除。

下面的 for 循环在一个实例中实现了这一点

def sorting_insert_list(x):

        x = list(x)
        for i in range(len(x)):
                keyword = x[1]
                location = x[2]
        x[0].append(location)
        x[0].insert(0, keyword)

        print(x)

并返回以下结果

[['new string 1', 'string 1', 1, 2, 'string 2', 0, 'string 3', 'new string 2'], 'new string 1', 'new string 2', ['string 3', 19, 2, 'string 4', 0, 'string 5'], 'new string 3', 'new string 4', ['string 6', 1, 2, 'string 7', 0, 'string 8'], 'new string 5', 'new string 6']

我需要的最终列表如下所示:

sorted_list = ['new string 1', 'string 1', 1, 2, 'string 2', 0, 'string 3','new string 2',]   ['new string 3''string 3', 19, 2, 'string 4', 0, 'string 5', 'new string 4',], ['new string 5','string 6', 1, 2, 'string 7', 0, 'string 8','new string 6']

可能值得注意的是,我会为一个庞大的列表执行此操作,我只是简化了数据以作为示例显示。谢谢。

添加尝试合并日期,然后出现在列表中new string 2 之后的位置 x[3]:

def sorting_insert_list(x):
    result = []
    for i in range(0, len(3)):
        keyword = x[i + 1]
        location = x[i + 2]
        date = insert_values[i + 3]
        result += [[keyword] + x[i] + [location] + date]
    x = result
    print(x)

【问题讨论】:

  • 抱歉,更新列表x

标签: python python-3.x


【解决方案1】:

我认为最好的方法是放弃原始列表x,并创建一个新列表来组成您的结果,而不是从列表中删除第二、第三个元素,您可以试试这个:

# list comprehension, more pythonic
def sorting_insert_list(x):
    x = [[x[i+1]] + x[i] + [x[i+2]] for i in range(0, len(x) // 3 * 3, 3)]
    print(x)

# base on your version
def sorting_insert_list(x):
    result = []
    for i in range(0, len(x) // 3 * 3, 3):
        keyword = x[i + 1]
        location = x[i + 2]
        result += [[keyword] + x[i] + [location]]
    x = result
    print(x)

测试:

x = [['string 1', 1, 2, 'string 2', 0, 'string 3'], 'new string 1', 'new string 2',
     ['string 3', 19, 2, 'string 4', 0, 'string 5'], 'new string 3', 'new string 4',
     ['string 6', 1, 2, 'string 7', 0, 'string 8'], 'new string 5', 'new string 6',
     ['string 9', 19, 2, 'string 10', 0, 'string 11']]

sorting_insert_list(x)

输出:

[['new string 1', 'string 1', 1, 2, 'string 2', 0, 'string 3', 'new string 2'], ['new string 3', 'string 3', 19, 2, 'string 4', 0, 'string 5', 'new string 4'], ['new string 5', 'string 6', 1, 2, 'string 7', 0, 'string 8', 'new string 6']]

顺便说一句,len(x) // 3 * 3 用于忽略小于 3 的尾部,如您的示例。如果你保证len(x) % 3 == 0,你可以使用len(x)

希望对您有所帮助,如果您还有其他问题,请发表评论。 :)

【讨论】:

  • 非常感谢,效果很好!我选择了第二个例子,因为它对我来说更容易理解!正如你提到的,我也使用了len(x)。再次感谢!
  • 我写第二个版本以防你不熟悉python。很高兴它可以帮助你。 :)
  • 我还需要在列表末尾附加一个date 值,但我收到以下错误TypeError: can only concatenate list (not "datetime.date") to list。我更新了上面的代码以显示我正在做些什么来尝试实现这一目标。
  • 使用append,而不是+= 可能会对您有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2022-12-13
  • 1970-01-01
相关资源
最近更新 更多