我如何检查列表中每个元素的前几位是否相同?
/** Initialize your data structure here. Set the size of the queue to be k. */
private ArrayList<Integer> list;
private int head = -1;
private int tail = -1;
private int count = 0;
public MyCircularQueue(int k) {
list = new ArrayList<Integer>(k);
}
/** Insert an element into the circular queue. Return true if the operation is successful. */
public boolean enQueue(int value) {
if(list.isEmpty()){
tail = (tail+1) % list.size();
list.add(tail);
count++;
if(head == -1){
tail = head;
}
return true;
}
return false;
}
/** Delete an element from the circular queue. Return true if the operation is successful. */
public boolean deQueue() {
if(!list.isEmpty()){
int ele = list.get(head);
head = (head+1) % list.size();
list.remove(ele);
count--;
return true;
}
return false;
}
/** Get the front item from the queue. */
public int Front() {
int a =list.get(head);
return a;
}
/** Get the last item from the queue. */
public int Rear() {
int b = list.get(tail);
return b;
}
/** Checks whether the circular queue is empty or not. */
public boolean isEmpty() {
if(list.isEmpty()){
return true;
}
return false;
}
/** Checks whether the circular queue is full or not. */
public boolean isFull() {
if(list.size() == count){
return true;
}
return false;
}
我知道这会检查列表中的前一个数字是否等于下一个数字,但是我只想关注第一个数字。
答案 0 :(得分:1)
使用all()
作为数字第一个字符的生成器:
>>> l = [1, 10, 123]
>>> all(str(x)[0] == str(l[0])[0] for x in l)
True
列表理解
>>> [str(x)[0] for x in l]
创建列表
['1', '1', '1']
这听起来就足够了。但是all
处理 boolean 值,并且字符串的布尔值始终为True
,除非字符串为空。这意味着它还将['1','2','3']
视为True
。您需要添加一个与常量值的比较-我从原始列表中选择了第一项:
>>> [str(x)[0] == str(l[0])[0] for x in l]
[True, True, True]
显示诸如[1,20,333]
之类的列表
['1', '2', '3']
和
[True, False, False]
您也可以将其调整为更多数字:
>>> all(str(x)[:2] == str(l[0])[:2] for x in l)
False
>>> l = [12,123,1234]
>>> all(str(x)[:2] == str(l[0])[:2] for x in l)
True
答案 1 :(得分:1)
您可以使用math.log10
和底数除法来计算第一位数字。然后使用带有生成器表达式的all
和zip
依次测试相邻的元素:
from math import log10
def get_first(x):
return x // 10**int(log10(x))
L = [12341, 1765, 1342534, 176845, 1]
res = all(get_first(i) == get_first(j) for i, j in zip(L, L[1:])) # True
有关此构造如何工作的解释,请参见this related answer。您可以通过常规的for
循环应用相同的逻辑:
def check_first(L):
for i, j in zip(L, L[1:]):
if get_first(i) != get_first(j):
return False
return True
res = check_first(L) # True
答案 2 :(得分:0)
您可以执行以下操作:
lst = [12, 13, 14]
def all_equals(l):
return len(set(e[0] for e in map(str, l))) == 1
print all_equals(lst)
输出
True
说明
函数map(str, l)
将列表中的所有元素转换为字符串,然后使用生成器表达式(e[0] for e in map(str, l))
获得所有元素的第一位。最后将生成器输入到set函数中,这将删除所有重复项,最后您必须检查set的长度是否为1,这意味着所有元素都是重复项。
答案 3 :(得分:0)
对于这样的列表上的布尔谓词,您需要一个解决方案,该解决方案在发现冲突后立即返回False
-转换 entire 列表只是为了找到冲突的解决方案第一和第二项不匹配不是好的算法。这是一种方法:
def all_same_first(a):
return not a or all(map(lambda b, c=str(a[0])[0]: str(b)[0] == c, a[1:]))
尽管乍看之下这似乎违反了我上面所说的内容,但是map
函数是惰性的,因此仅在需要时才将all
函数移交给需要的东西,因此元素与返回的布尔结果的第一个(起始数字位数)不匹配,并且列表的其余部分未得到处理。
返回原始代码:
这将检查前面的数字是否等于下一个 列表中的数字
for i in range(0,len(lst)-1):
if lst[i] == lst[i+1]:
return True
正如您所说,这不起作用。为了正常工作,需要这样做:
for i in range(0, len(lst) - 1):
if lst[i] != lst[i + 1]:
return False
return True
您看到区别了吗?