【问题标题】:Python Two Lists from One list with TabPython 一个列表中的两个列表,带有选项卡
【发布时间】:2018-08-07 18:42:42
【问题描述】:

我有一个清单:

data = ['Other stuff',186.797\t-48',
 '187.272\t-48',
 '187.747\t-48',
 '188.222\t-45',
 '188.697\t-43',
 '189.172\t6',
 '189.646\t-23',
 '190.121\t12',...]

如何创建两个列表,一个在“/t”之前有值,另一个在之后有值。

但是,我只想从 data[1] 到 len(data) 跳过第一个值,因为它只是描述性文本。

例如:

L1 = [186.797,...,190.121]
L2 = [-48,..., 12]

【问题讨论】:

  • 这是一个未正确解析的 TSV 吗?
  • 我用来生成值的程序只是吐出数据。左边是波长,右边是时间。我只是不确定如何在 python 中将其分成两个列表,因为每个值的长度不同。
  • L1, L2 = zip(*(s.split('\t') for s in data)) 会带你到那里...
  • 甚至,L1, L2 = zip(*map(str.split, data))

标签: python python-3.x list split python-2.x


【解决方案1】:

使用列表推导并使用.split() 分隔值

l = ['186.797\t-48', '187.272\t-48', '187.747\t-48', '189.172\t6']

[x.split('\t')[0] for x in l]
['186.797', '187.272', '187.747', '189.172']

[x.split('\t')[1] for x in l]
['-48', '-48', '-48', '6']

编辑:如果您需要新列表中的数字值,请将值转换为 float()int()

l = ['186.797\t-48', '187.272\t-48', '187.747\t-48', '189.172\t6']

[float(x.split('\t')[0]) for x in l]
[186.797, 187.272, 187.747, 189.172]

[int(x.split('\t')[1]) for x in l]
[-48, -48, -48, 6]

【讨论】:

  • 我认为 Brian 希望输出是整数
  • 是的,他的问题没有引号
【解决方案2】:

一个简单明了的方法是使用列表理解并描述您想要从哪里获取所有数据。您可以使用.split("\t") 将每个元素分解为具有两个值的元组,并由选项卡拆分。然后使用floatint转换你想要的元素。

# Iterate over the list and grab everything before the \t and convert to a float
L1 = [float(val.split("\t")[0]) for val in values]
#: [186.797, 187.272, 187.747, 188.222, 188.697, 189.172, 189.646, 190.121]

# Iterate over the list and grab everything after the \t and convert to an int
L2 = [int(val.split("\t")[1]) for val in values]
#: [-48, -48, -48, -45, -43, 6, -23, 12]

【讨论】:

    【解决方案3】:

    你可以使用正则表达式:

    import re
    s = ['186.797\t-48',
     '187.272\t-48',
     '187.747\t-48',
     '188.222\t-45',
     '188.697\t-43',
     '189.172\t6',
     '189.646\t-23',
     '190.121\t12']
    
    L1, L2 = map(list, zip(*[[float(re.findall('[\d\.]+', i)[0]), int(re.findall('[\-\d]+$', i)[0])] for i in s]))
    

    输出:

    [186.797, 187.272, 187.747, 188.222, 188.697, 189.172, 189.646, 190.121]
    [-48, -48, -48, -45, -43, 6, -23, 12]
    

    【讨论】:

    • 为什么需要所有的正则表达式?
    • @pstatix 已经有一段时间了,但事后看来,我可能会使用str.split 或单re.split。但是,re.findall 使 zip 生成的列更容易一些。
    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2021-01-25
    • 2021-10-22
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多