{{1}}
这段代码给了我输出 ['c','a','t','d','o','g','r','a','b','b','i','t'] < / p>
我不希望列表中有任何冗余元素。谁能告诉我我做错了什么。我想知道为什么if语句不起作用? 有没有其他方法可以使用List comprehension来完成它,这样我就不必在最初定义一个命名列表。
答案 0 :(得分:4)
如果您只想要独特的字母,那么使用套装怎么样?
>>> word = ['cat', 'dog' ,'rabbit']
>>> set().union(*word)
set(['a', 'c', 'b', 'd', 'g', 'i', 'o', 'r', 't'])
如果你想保留订单,我想你可以做到
letters = "".join(word)
s = [letter for idx, letter in enumerate(letters) if letters.index(letter) == idx]
或者,如果绝对有必要在一行中进行
s = (lambda letters: [letter for idx, letter in enumerate(letters) if letters.index(letter) == idx])("".join(word))
但这两个都是O(N ^ 2),因此它们对于长列表来说是不切实际的。
答案 1 :(得分:4)
您将s
定义为空列表。在重新分配给列表理解的结果之前,这不会改变;直到理解本身已经执行才能发生。因此,在代码处于理解范围内时,s
仍为空,因此s.count(whatever)
始终为0.
答案 2 :(得分:3)
丹尼尔罗斯曼解释了为什么你的列表理解不符合你的要求。但是如果使用传统的for
循环,那么你的逻辑工作正常:
word = ['cat', 'dog' ,'rabbit']
s = []
for w in word:
for l in w:
if l not in s:
s.append(l)
print s
<强>输出强>
['c', 'a', 't', 'd', 'o', 'g', 'r', 'b', 'i']
列表推导稍微在附加到列表时比在.append()
循环中使用for
更有效,因为它们使用特殊的LIST_APPEND字节码,节省了方法调用,但通常速度差是边际的。
答案 3 :(得分:0)
if语句有效,但是如果存在非冗余元素$date1 = $_POST['tst1'];
$date2 = $_POST['tst2'];
for($i = 0; $i < sizeof($date1); $i++){
$diff = abs(strtotime($date2[$i]) - strtotime($date1[$i]));
//...
}
,则需要更新s
。只需将l
附加到l
。
s
输出
word = ['cat', 'dog' ,'rabbit']
s = []
[s.append(l) for w in word for l in w if s.count(l)==0]
print s