【问题标题】:How to remove the first and last value of the first and last element that is separated by (.) and need to join the other elements in the list如何删除由(。)分隔的第一个和最后一个元素的第一个和最后一个值,并且需要加入列表中的其他元素
【发布时间】:2019-01-25 09:39:15
【问题描述】:

我有一个像这样的python列表

['6403687.6403773','6404555.6404614','6413270.6413335']

在这我需要删除第一个元素的第一个值(6403687)和最后一个元素的最后一个值(6413335),并且需要像这样['6403773.6404555','6404614.6413270']加入另一个元素。像这样我有几个具有 n 个值的列表。我不知道该怎么做。如果有人请帮助我。

list = ['6403687.6403773','6404555.6404614','6413270.6413335']

删除第一个和最后一个值后,我需要一个这样的列表

list1 = ['6403773.6404555','6404614.6413270']

【问题讨论】:

  • 你至少尝试过一种简单的for循环方法吗?
  • 您标题中的预期解决方案与您问题中描述的过程不匹配。请解决这个问题。更好的是,找到一个更具描述性的标题,因为现在它相当混乱。
  • 你知道如何在某个字符上分割字符串吗?你知道如何以大于 1 的步长迭代列表吗?你知道如何连接两个字符串吗?你知道如何建立一个新的列表吗?您将需要所有这些步骤,但您可能已经完成了大部分步骤,那么您坚持哪一个?你能展示你解决这个问题的尝试吗?
  • 是的,列表的第一个和最后一个元素,无论它有多大
  • 好吧,我删除了我的评论,因为在更仔细地阅读了你想要的输出之后,我意识到这不是我想的那样。您将获取每个元素的第二部分并将其与下一个元素的第一部分结合起来,而不是获取列表的第一个元素和最后一个元素。

标签: python list split


【解决方案1】:

此方法将逐步完成,也适用于列表或任意长度:

number_strings = ['6403687.6403773','6404555.6404614','6413270.6413335']

# remove first part of element
number_strings[0] = number_strings[0].split('.')[1]

# remove last part of last element
number_strings[-1] = number_strings[-1].split('.')[0]

# remove points
number_strings_rearranged = []
for element in number_strings:
    for part_string in element.split('.'):
        number_strings_rearranged.append(part_string)

# restructure with points
number_strings = [number_strings_rearranged[i]+'.'+number_strings_rearranged[i+1] for i in range(0, len(number_strings_rearranged)-1, 2)]

print(number_strings)

输出:

['6403773.6404555', '6404614.6413270']

【讨论】:

    【解决方案2】:

    嗯,一种方法是这样的:

    from itertools import islice
    
    lst = ['6403687.6403773','6404555.6404614','6413270.6413335']
    
    # split at ".", flatten and remove both ends (slice)
    flat = [num for pair in lst for num in pair.split('.')][1:-1]
    
    # pair the entries in 2s and join them
    res = ['.'.join(islice(flat, 2)) for _ in range(len(flat)//2) ]
    

    产生:

    print(res)  # -> ['6403773.6404555', '6403773.6404555']
    

    或者,如果您不喜欢islice 的最后一步(我也不是超级粉丝),您可以使用grouper itertool recipe

    def grouper(iterable, n, fillvalue=None):
        "Collect data into fixed-length chunks or blocks"
        # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
        args = [iter(iterable)] * n
        return zip_longest(*args, fillvalue=fillvalue)
    

    改为做

    res = ['.'.join(group) for group in grouper(flat, 2)]
    

    当然结果相同。

    【讨论】:

      【解决方案3】:

      假设您的列表始终计数为 3,因为您没有提供任何关于它是动态的信息:

      startList = ['6403687.6403773','6404555.6404614','6413270.6413335']
      newList = []
      newList.append(startList[0].split('.')[1] + '.' + startList[1].split('.')[0])
      # split first value and take second half and concat with the middle value's first half
      newList.append(startList[1].split('.')[1] + '.' + startList[2].split('.')[0])
      # split last value and take first half and concat with the middle value's second half
      

      输出:

      ['6403773.6404555','6404614.6413270']
      

      【讨论】:

      • 在动态的情况下怎么做
      • @Aishwarya 在这种情况下,最后一个值被添加到哪里?请将其添加到您的问题中,以便清楚。
      • @Aishwarya:我的回答(如下)为您提供了任意长度 n 的解决方案。
      【解决方案4】:

      虽然很多人回答了这个问题,但我想通过使用简单的 for 循环来提供一种不同且简单的方法来处理长列表。

      aa = ['6403687.6403773','6404555.6404614','6413270.6413335']
      pr, bb ="", []
      for v in aa:
          l, r = v.split(".")
          bb.append(f"{pr}.{l}")
          pr = r
      print (bb[1:])
      

      输出:

      #Result: ['6403773.6404555', '6404614.6413270']
      

      我希望这会有所帮助:)

      【讨论】:

      • 还不错!但是,您应该在末尾添加一个 'bb = bb[1:]' 以将正确的输出保存到 'bb'。
      • 谢谢! @mrCarnivore 你是对的,对于独立代码,将它重新分配给 bb 很好。但是,我想把它留在 bb[1:] 上,因为它不言自明,艾西瓦娅可以随意使用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多