设计并实现一个数组类,要求能够把包含数字的列表、元组或 range 对象转换为数组,能够使用包含整数的列表作为下标同时返回多个位置上的元素值。
时间: 2024-03-25 11:38:12 浏览: 280
好的,我可以帮您设计并实现一个数组类。如下是一个简单的实现,您可以根据自己的需求进行扩展:
```python
class Array:
def __init__(self, data):
# 将列表、元组或 range 对象转换为数组
if isinstance(data, (list, tuple)):
self.data = list(data)
elif isinstance(data, range):
self.data = list(data)
else:
raise TypeError("Invalid data type")
def __getitem__(self, index):
# 返回多个位置上的元素值
if isinstance(index, int):
return self.data[index]
elif isinstance(index, slice):
start, stop, step = index.indices(len(self.data))
return [self.data[i] for i in range(start, stop, step)]
elif isinstance(index, (list, tuple)):
return [self.data[i] for i in index]
else:
raise TypeError("Invalid index type")
def __setitem__(self, index, value):
# 修改指定位置上的元素值
if isinstance(index, int):
self.data[index] = value
elif isinstance(index, slice):
start, stop, step = index.indices(len(self.data))
if isinstance(value, (list, tuple)):
if len(value) != len(range(start, stop, step)):
raise ValueError("Invalid value length")
for i, v in enumerate(value):
self.data[start + i * step] = v
else:
for i in range(start, stop, step):
self.data[i] = value
elif isinstance(index, (list, tuple)):
if isinstance(value, (list, tuple)):
if len(value) != len(index):
raise ValueError("Invalid value length")
for i, v in zip(index, value):
self.data[i] = v
else:
for i in index:
self.data[i] = value
else:
raise TypeError("Invalid index type")
def __len__(self):
# 返回数组的长度
return len(self.data)
def __repr__(self):
# 返回数组的字符串表示形式
return f"Array({self.data})"
```
使用示例:
```python
>>> a = Array([1, 2, 3, 4, 5])
>>> a[0]
1
>>> a[1:4:2]
[2, 4]
>>> a[[1, 3, 4]]
[2, 4, 5]
>>> a[3] = 6
>>> a[:]
[1, 2, 3, 6, 5]
>>> a[:3] = [0, 0, 0]
>>> a[:]
[0, 0, 0, 6, 5]
>>> a[[1, 3, 4]] = [1, 1, 1]
>>> a[:]
[0, 1, 0, 6, 1]
>>> len(a)
5
>>> repr(a)
'Array([0, 1, 0, 6, 1])'
```
希望这个实现能够满足您的需求。
阅读全文