4

如果所有元素都是 int 或者都是 string 则我需要编写一段代码然后返回 true,否则返回 false

[1,'1','a','b'] False
[1,2,3,4] True
['apple','orange','melon'] True
['1', 2, 3, 4] False

我的解决方案是这些

def foo(l):
    t = type(l[0])
    if t is not str and t is not int:
        return False
    for x in l:
        if t != type(x):
            return False
    return True

我认为应该更好。

4

8 回答 8

11

此代码通常检查所有元素是否属于同一类型:

len(set(type(elem) for elem in elems)) == 1

它回答了您的问题的标题,但与您的解决方案不同(它为浮动列表返回 false)。

于 2012-09-13T09:05:07.933 回答
3

如果您要求列表l中的所有元素都属于某种类型,例如int,那么以下是一种非常有效的方法:

any(not isinstance(e, int) for e in l)

它会短路,即在第一次出现不是 if 类型的列表元素时,int它的计算结果为False

如果您要求列表l中的所有元素都属于同一类型并且不提供此类型作为输入信息,则列表中至少有一个元素,那么这个 a 是类比:

all(type(e) == type(l[0])) for e in l)
于 2012-09-13T09:07:40.820 回答
2
type(l[0]) in [int, str] and all( type(e) == type(l[0]) for e in l)
于 2012-09-13T09:14:03.970 回答
1
def all_of(iterable, types=[str,int])
    actual_types = set(map(type, iterable))
    return len(actual_types) == 1 and next(iter(actual_types)) in types
于 2012-09-13T09:06:26.397 回答
1
In [32]: len(set(map(type, [1, 2, 3]))) == 1
Out[32]: True

In [33]: len(set(map(type, [1, 2, '3']))) == 1
Out[33]: False
于 2012-09-13T09:06:44.033 回答
1

如果您想检查序列是否都是特定类型...

def check_all_same_type(sequence, typ, strict=True):
    if strict:
        return all(type(item) == typ for item in sequence)
    return all(isinstance(item, typ) for item in sequence)

如果您只是想确保它们都是同一类型...

types = set(type(item) for item in sequence)
all_same = (len(types) == 1)
if all_same:
    print "They're all a type of", type(next(iter(types)))
于 2012-09-13T09:10:22.320 回答
0

我认为它会更快:

对于ints

>>> ints = set(list(range(10)))
>>> ints
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>
>>>
>>>
>>> l = set([1,2,3,'d'])
>>> l - ints
set(['d'])
>>>
>>> l = set([1,2,'3','d'])
>>> l - ints
set(['3', 'd'])
>>>

可以将此方法用于str's.

于 2012-09-13T09:40:09.770 回答
0

这是我可以做到的。检查初始条件后,一旦 elem 的类型未能通过,该函数将停止检查。它还处理空列表。

def check_elem_types(l):
    return bool(l) and type(l[0]) in (int, str) and all(type(e) == type(l[0]) for e in l[1:])

如果你想处理 unicode 字符串(在 Python 2.x 中),你需要这个:

def check_elem_types(l):
    return (bool(l) and isinstance(l[0], (int, basestring)) and
            all(type(e) == type(l[0]) for e in l[1:]))
于 2012-09-13T09:48:21.117 回答