仅保存Python列表中每个成员的一部分

时间:2013-11-27 01:46:13

标签: python list

我在python中有一个列表:

list = ['hello there 123 456', 'hello there 234 567', 'hello there 345 678']

我想将其更改为:

list = ['123','234','345']

如何只保存每个索引的第一个整数?

第一个整数前面总是会有相同数量的字符条目/单词。

6 个答案:

答案 0 :(得分:3)

如果您的列表是这样的:

list1 = [("hello", 'there', 123, 456, 789), ('hello', 'there', 234, 567, 890), ('hello', 'there', 345, 678, 912)]

然后简单地使用列表理解如下:

new_lst = [i[2] for i in list1]

new_lst现在为[123, 234, 345]


修改

使用新语法执行以下操作:

list = ['hello there 123 456', 'hello there 234 567', 'hello there 345 678']
new_lst = [i.split(' ')[2] for i in list1]

new_lst现在会给出相同的结果

答案 1 :(得分:3)

以下是get_portion功能

的一种可能实现方式
>>> def get_portion(s):
...     return next(i for i in s.split() if i.isdigit())
... 
>>> L = ['hello there 123 456', 'hello there 234 567', 'hello there 345 678']
>>> [get_portion(s) for s in L]
['123', '234', '345']

通过使用显式函数,您可以轻松编写doctests / unittests。以下是doctests

的示例
def get_portion(n):
    """Return the first chunk of digits in a string.

    >>> get_portion('hello there 123 456')
    '123'
    >>> get_portion('hello there 234 567')
    '234'
    >>> get_portion('hello there 345 678')
    '345'
    """
    return next(i for i in s.split() if i.isdigit())

答案 2 :(得分:0)

如果你不知道整数是在索引2,但是你知道“第一个整数前面总是会有相同数量的字符条目/单词。”,那么先在它上面加上一个测试。第一个找到该索引的元素:

ofst = None
for x, elem in enumerate(list1[0].split()):
    try:
        int(elem)
    except ValueError:
        continue
    ofst = x
    break
else:
    print "No integer found."
    return

new_lst = [i.split()[ofst] for i in list1]

答案 3 :(得分:0)

既然您的样本列表有效,我可以帮助您。

您可以使用list comprehensionstr.split

>>> # Please don't name a variable `list` -- it overshadows the built-in.
>>> lst = ['hello there 123 456', 'hello there 234 567', 'hello there 345 678']
>>> [x.split()[2] for x in lst]
['123', '234', '345']
>>>

答案 4 :(得分:0)

好的,所以你有一个字符串列表:

['hello there 123 456', 'hello there 234 567', 'hello there 345 678']

并且你希望获得“第一个整数”,前缀总是相同的长度并且具有相同的空格数。

至少有三种方法可以做到:

  • 分成单词,并获得第一个有效整数。
  • 分成单词,得到第三个单词。
  • 剪掉你想要的三个字符。

哪一个最好?这取决于你在创建这种格式时最符合你头脑中的定义的规则 - 或者在创建它时在别人头脑中的定义,或者当你想出它时在头脑中的定义,或者......等等。它们都很容易做到,唯一的决定选择是哪一个自然地读取这个特定的用例。

然后,无论您选择哪一个,都需要对列表中的每个字符串执行此操作。列表理解是完美的。

所以:

new_list = [next(word for word in value if word.isdigit()) for value in original_list]
new_list = [value.split()[2] for value in original_list]
new_list = [value[12:15] for value in original_list]

答案 5 :(得分:0)

从给定列开始:

START_CH = 12
list = [s[START_CH:].split(1)[0] for s in list]

从给定的单词开始:

WORD = 3
list = [s.split(WORD)[WORD-1] for s in list]