Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
85f64437
Commit
85f64437
authored
Jul 31, 2000
by
Peter Schneider-Kamp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added count, extend, index, pop and remove to arraymodule
parent
795de228
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
233 additions
and
74 deletions
+233
-74
Doc/lib/libarray.tex
Doc/lib/libarray.tex
+23
-0
Doc/lib/libstdtypes.tex
Doc/lib/libstdtypes.tex
+2
-2
Lib/test/test_array.py
Lib/test/test_array.py
+40
-0
Modules/arraymodule.c
Modules/arraymodule.c
+168
-72
No files found.
Doc/lib/libarray.tex
View file @
85f64437
...
@@ -83,6 +83,14 @@ values, \exception{RuntimeError} is raised. It is useful when reading
...
@@ -83,6 +83,14 @@ values, \exception{RuntimeError} is raised. It is useful when reading
data from a file written on a machine with a different byte order.
data from a file written on a machine with a different byte order.
\end{methoddesc}
\end{methoddesc}
\begin{methoddesc}
[array]
{
count
}{
x
}
Return the number of occurences of
\var
{
x
}
in the array.
\end{methoddesc}
\begin{methoddesc}
[array]
{
extend
}{
a
}
Append array items from
\var
{
a
}
to the end of the array.
\end{methoddesc}
\begin{methoddesc}
[array]
{
fromfile
}{
f, n
}
\begin{methoddesc}
[array]
{
fromfile
}{
f, n
}
Read
\var
{
n
}
items (as machine values) from the file object
\var
{
f
}
Read
\var
{
n
}
items (as machine values) from the file object
\var
{
f
}
and append them to the end of the array. If less than
\var
{
n
}
items
and append them to the end of the array. If less than
\var
{
n
}
items
...
@@ -104,11 +112,22 @@ array of machine values (i.e. as if it had been read from a
...
@@ -104,11 +112,22 @@ array of machine values (i.e. as if it had been read from a
file using the
\method
{
fromfile()
}
method).
file using the
\method
{
fromfile()
}
method).
\end{methoddesc}
\end{methoddesc}
\begin{methoddesc}
[array]
{
index
}{
x
}
Return the smallest
\var
{
i
}
such that
\var
{
i
}
is the index of
the first occurence of
\var
{
x
}
in the array.
\end{methoddesc}
\begin{methoddesc}
[array]
{
insert
}{
i, x
}
\begin{methoddesc}
[array]
{
insert
}{
i, x
}
Insert a new item with value
\var
{
x
}
in the array before position
Insert a new item with value
\var
{
x
}
in the array before position
\var
{
i
}
.
\var
{
i
}
.
\end{methoddesc}
\end{methoddesc}
\begin{methoddesc}
[array]
{
pop
}{
\optional
{
i
}}
Removes the item with the index
\var
{
i
}
from the array and returns
it. The optional argument defaults to
\code
{
-1
}
, so that by default
the last item is removed and returned.
\end{methoddesc}
\begin{methoddesc}
[array]
{
read
}{
f, n
}
\begin{methoddesc}
[array]
{
read
}{
f, n
}
\deprecated
{
1.5.1
}
\deprecated
{
1.5.1
}
{
Use the
\method
{
fromfile()
}
method.
}
{
Use the
\method
{
fromfile()
}
method.
}
...
@@ -120,6 +139,10 @@ built-in file object; something else with a \method{read()} method won't
...
@@ -120,6 +139,10 @@ built-in file object; something else with a \method{read()} method won't
do.
do.
\end{methoddesc}
\end{methoddesc}
\begin{methoddesc}
[array]
{
remove
}{
x
}
Remove the first occurence of
\var
{
x
}
from the array.
\end{methoddesc}
\begin{methoddesc}
[array]
{
reverse
}{}
\begin{methoddesc}
[array]
{
reverse
}{}
Reverse the order of the items in the array.
Reverse the order of the items in the array.
\end{methoddesc}
\end{methoddesc}
...
...
Doc/lib/libstdtypes.tex
View file @
85f64437
...
@@ -506,8 +506,8 @@ Notes:
...
@@ -506,8 +506,8 @@ Notes:
\item
[(3)]
Raises
\exception
{
ValueError
}
when
\var
{
x
}
is not found in
\item
[(3)]
Raises
\exception
{
ValueError
}
when
\var
{
x
}
is not found in
\var
{
s
}
.
\var
{
s
}
.
\item
[(4)]
The
\method
{
pop()
}
method is experimental and
not supported
\item
[(4)]
The
\method
{
pop()
}
method is experimental and
at the moment
by other mutable sequence types than list
s. The optional argument
only supported by the list and array type
s. The optional argument
\var
{
i
}
defaults to
\code
{
-1
}
, so that by default the last item is
\var
{
i
}
defaults to
\code
{
-1
}
, so that by default the last item is
removed and returned.
removed and returned.
...
...
Lib/test/test_array.py
View file @
85f64437
...
@@ -105,6 +105,26 @@ def testtype(type, example):
...
@@ -105,6 +105,26 @@ def testtype(type, example):
a
[
1
:
-
1
]
=
a
a
[
1
:
-
1
]
=
a
if
a
!=
array
.
array
(
type
,
"aabcdee"
):
if
a
!=
array
.
array
(
type
,
"aabcdee"
):
raise
TestFailed
,
"array(%s) self-slice-assign (cntr)"
%
`type`
raise
TestFailed
,
"array(%s) self-slice-assign (cntr)"
%
`type`
if
a
.
index
(
"e"
)
!=
5
:
raise
TestFailed
,
"array(%s) index-test"
%
`type`
if
a
.
count
(
"a"
)
!=
2
:
raise
TestFailed
,
"array(%s) count-test"
%
`type`
a
.
remove
(
"e"
)
if
a
!=
array
.
array
(
type
,
"aabcde"
):
raise
TestFailed
,
"array(%s) remove-test"
%
`type`
if
a
.
pop
(
0
)
!=
"a"
:
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
if
a
.
pop
(
1
)
!=
"b"
:
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
a
.
extend
(
array
.
array
(
type
,
"xyz"
))
if
a
!=
array
.
array
(
type
,
"acdexyz"
):
raise
TestFailed
,
"array(%s) extend-test"
%
`type`
a
.
pop
()
a
.
pop
()
a
.
pop
()
a
.
pop
()
if
a
!=
array
.
array
(
type
,
"acd"
):
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
else
:
else
:
a
=
array
.
array
(
type
,
[
1
,
2
,
3
,
4
,
5
])
a
=
array
.
array
(
type
,
[
1
,
2
,
3
,
4
,
5
])
a
[:
-
1
]
=
a
a
[:
-
1
]
=
a
...
@@ -118,6 +138,26 @@ def testtype(type, example):
...
@@ -118,6 +138,26 @@ def testtype(type, example):
a
[
1
:
-
1
]
=
a
a
[
1
:
-
1
]
=
a
if
a
!=
array
.
array
(
type
,
[
1
,
1
,
2
,
3
,
4
,
5
,
5
]):
if
a
!=
array
.
array
(
type
,
[
1
,
1
,
2
,
3
,
4
,
5
,
5
]):
raise
TestFailed
,
"array(%s) self-slice-assign (cntr)"
%
`type`
raise
TestFailed
,
"array(%s) self-slice-assign (cntr)"
%
`type`
if
a
.
index
(
5
)
!=
5
:
raise
TestFailed
,
"array(%s) index-test"
%
`type`
if
a
.
count
(
1
)
!=
2
:
raise
TestFailed
,
"array(%s) count-test"
%
`type`
a
.
remove
(
5
)
if
a
!=
array
.
array
(
type
,
[
1
,
1
,
2
,
3
,
4
,
5
]):
raise
TestFailed
,
"array(%s) remove-test"
%
`type`
if
a
.
pop
(
0
)
!=
1
:
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
if
a
.
pop
(
1
)
!=
2
:
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
a
.
extend
(
array
.
array
(
type
,
[
7
,
8
,
9
]))
if
a
!=
array
.
array
(
type
,
[
1
,
3
,
4
,
5
,
7
,
8
,
9
]):
raise
TestFailed
,
"array(%s) extend-test"
%
`type`
a
.
pop
()
a
.
pop
()
a
.
pop
()
a
.
pop
()
if
a
!=
array
.
array
(
type
,
[
1
,
3
,
4
]):
raise
TestFailed
,
"array(%s) pop-test"
%
`type`
# test that overflow exceptions are raised as expected for assignment
# test that overflow exceptions are raised as expected for assignment
# to array of specific integral types
# to array of specific integral types
...
...
Modules/arraymodule.c
View file @
85f64437
...
@@ -673,6 +673,163 @@ ins(arrayobject *self, int where, PyObject *v)
...
@@ -673,6 +673,163 @@ ins(arrayobject *self, int where, PyObject *v)
return
Py_None
;
return
Py_None
;
}
}
static
PyObject
*
array_count
(
arrayobject
*
self
,
PyObject
*
args
)
{
int
count
=
0
;
int
i
;
PyObject
*
v
;
if
(
!
PyArg_ParseTuple
(
args
,
"O:count"
,
&
v
))
return
NULL
;
for
(
i
=
0
;
i
<
self
->
ob_size
;
i
++
)
{
PyObject
*
selfi
=
getarrayitem
((
PyObject
*
)
self
,
i
);
if
(
PyObject_Compare
(
selfi
,
v
)
==
0
)
count
++
;
Py_DECREF
(
selfi
);
if
(
PyErr_Occurred
())
return
NULL
;
}
return
PyInt_FromLong
((
long
)
count
);
}
static
char
count_doc
[]
=
"count (x)
\n
\
\n
\
Return number of occurences of x in the array."
;
static
PyObject
*
array_index
(
arrayobject
*
self
,
PyObject
*
args
)
{
int
i
;
PyObject
*
v
;
if
(
!
PyArg_ParseTuple
(
args
,
"O:index"
,
&
v
))
return
NULL
;
for
(
i
=
0
;
i
<
self
->
ob_size
;
i
++
)
{
PyObject
*
selfi
=
getarrayitem
((
PyObject
*
)
self
,
i
);
if
(
PyObject_Compare
(
selfi
,
v
)
==
0
)
{
Py_DECREF
(
selfi
);
return
PyInt_FromLong
((
long
)
i
);
}
Py_DECREF
(
selfi
);
if
(
PyErr_Occurred
())
return
NULL
;
}
PyErr_SetString
(
PyExc_ValueError
,
"array.index(x): x not in list"
);
return
NULL
;
}
static
char
index_doc
[]
=
"index (x)
\n
\
\n
\
Return index of first occurence of x in the array."
;
static
PyObject
*
array_remove
(
arrayobject
*
self
,
PyObject
*
args
)
{
int
i
;
PyObject
*
v
;
if
(
!
PyArg_ParseTuple
(
args
,
"O:remove"
,
&
v
))
return
NULL
;
for
(
i
=
0
;
i
<
self
->
ob_size
;
i
++
)
{
PyObject
*
selfi
=
getarrayitem
((
PyObject
*
)
self
,
i
);
if
(
PyObject_Compare
(
selfi
,
v
)
==
0
)
{
Py_DECREF
(
selfi
);
if
(
array_ass_slice
(
self
,
i
,
i
+
1
,
(
PyObject
*
)
NULL
)
!=
0
)
return
NULL
;
Py_INCREF
(
Py_None
);
return
Py_None
;
}
Py_DECREF
(
selfi
);
if
(
PyErr_Occurred
())
return
NULL
;
}
PyErr_SetString
(
PyExc_ValueError
,
"array.remove(x): x not in list"
);
return
NULL
;
}
static
char
remove_doc
[]
=
"remove (x)
\n
\
\n
\
Remove the first occurence of x in the array."
;
static
PyObject
*
array_pop
(
arrayobject
*
self
,
PyObject
*
args
)
{
int
i
=
-
1
;
PyObject
*
v
;
if
(
!
PyArg_ParseTuple
(
args
,
"|i:pop"
,
&
i
))
return
NULL
;
if
(
self
->
ob_size
==
0
)
{
/* Special-case most common failure cause */
PyErr_SetString
(
PyExc_IndexError
,
"pop from empty array"
);
return
NULL
;
}
if
(
i
<
0
)
i
+=
self
->
ob_size
;
if
(
i
<
0
||
i
>=
self
->
ob_size
)
{
PyErr_SetString
(
PyExc_IndexError
,
"pop index out of range"
);
return
NULL
;
}
v
=
getarrayitem
((
PyObject
*
)
self
,
i
);
if
(
array_ass_slice
(
self
,
i
,
i
+
1
,
(
PyObject
*
)
NULL
)
!=
0
)
{
Py_DECREF
(
v
);
return
NULL
;
}
return
v
;
}
static
char
pop_doc
[]
=
"pop ([i])
\n
\
\n
\
Return the i-th element and delete it from the array. i defaults to -1."
;
static
PyObject
*
array_extend
(
self
,
args
)
arrayobject
*
self
;
PyObject
*
args
;
{
int
size
;
PyObject
*
bb
;
arrayobject
*
np
;
if
(
!
PyArg_ParseTuple
(
args
,
"O:extend"
,
&
bb
))
return
NULL
;
if
(
!
is_arrayobject
(
bb
))
{
PyErr_Format
(
PyExc_TypeError
,
"can only append array (not
\"
%.200s
\"
) to array"
,
bb
->
ob_type
->
tp_name
);
return
NULL
;
}
#define b ((arrayobject *)bb)
if
(
self
->
ob_descr
!=
b
->
ob_descr
)
{
PyErr_SetString
(
PyExc_TypeError
,
"can only append arrays of same kind"
);
return
NULL
;
}
size
=
self
->
ob_size
+
b
->
ob_size
;
PyMem_RESIZE
(
self
->
ob_item
,
char
,
size
*
self
->
ob_descr
->
itemsize
);
if
(
self
->
ob_item
==
NULL
)
{
PyObject_Del
(
self
);
return
PyErr_NoMemory
();
}
memcpy
(
self
->
ob_item
+
self
->
ob_size
*
self
->
ob_descr
->
itemsize
,
b
->
ob_item
,
b
->
ob_size
*
b
->
ob_descr
->
itemsize
);
self
->
ob_size
=
size
;
Py_INCREF
(
Py_None
);
return
Py_None
;
#undef b
}
static
char
extend_doc
[]
=
"extend(array)
\n
\
\n
\
Append array items to the end of the array."
;
static
PyObject
*
static
PyObject
*
array_insert
(
arrayobject
*
self
,
PyObject
*
args
)
array_insert
(
arrayobject
*
self
,
PyObject
*
args
)
{
{
...
@@ -816,74 +973,6 @@ static char reverse_doc [] =
...
@@ -816,74 +973,6 @@ static char reverse_doc [] =
\n
\
\n
\
Reverse the order of the items in the array."
;
Reverse the order of the items in the array."
;
/* The following routines were adapted from listobject.c but not converted.
To make them work you will have to work! */
#if 0
static PyObject *
array_index(arrayobject *self, PyObject *args)
{
int i;
if (args == NULL) {
PyErr_BadArgument();
return NULL;
}
for (i = 0; i < self->ob_size; i++) {
if (PyObject_Compare(self->ob_item[i], args) == 0)
return PyInt_FromLong((long)i);
/* XXX PyErr_Occurred */
}
PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
return NULL;
}
#endif
#if 0
static PyObject *
array_count(arrayobject *self, PyObject *args)
{
int count = 0;
int i;
if (args == NULL) {
PyErr_BadArgument();
return NULL;
}
for (i = 0; i < self->ob_size; i++) {
if (PyObject_Compare(self->ob_item[i], args) == 0)
count++;
/* XXX PyErr_Occurred */
}
return PyInt_FromLong((long)count);
}
#endif
#if 0
static PyObject *
array_remove(arrayobject *self, PyObject *args)
{
int i;
if (args == NULL) {
PyErr_BadArgument();
return NULL;
}
for (i = 0; i < self->ob_size; i++) {
if (PyObject_Compare(self->ob_item[i], args) == 0) {
if (array_ass_slice(self, i, i+1,
(PyObject *)NULL) != 0)
return NULL;
Py_INCREF(Py_None);
return Py_None;
}
/* XXX PyErr_Occurred */
}
PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
return NULL;
}
#endif
static
PyObject
*
static
PyObject
*
array_fromfile
(
arrayobject
*
self
,
PyObject
*
args
)
array_fromfile
(
arrayobject
*
self
,
PyObject
*
args
)
{
{
...
@@ -1095,16 +1184,18 @@ PyMethodDef array_methods[] = {
...
@@ -1095,16 +1184,18 @@ PyMethodDef array_methods[] = {
{
"buffer_info"
,
(
PyCFunction
)
array_buffer_info
,
0
,
buffer_info_doc
},
{
"buffer_info"
,
(
PyCFunction
)
array_buffer_info
,
0
,
buffer_info_doc
},
{
"byteswap"
,
(
PyCFunction
)
array_byteswap
,
METH_VARARGS
,
{
"byteswap"
,
(
PyCFunction
)
array_byteswap
,
METH_VARARGS
,
byteswap_doc
},
byteswap_doc
},
/* {"count", (method)array_count},*/
{
"count"
,
(
PyCFunction
)
array_count
,
1
,
count_doc
},
{
"extend"
,
(
PyCFunction
)
array_extend
,
1
,
extend_doc
},
{
"fromfile"
,
(
PyCFunction
)
array_fromfile
,
0
,
fromfile_doc
},
{
"fromfile"
,
(
PyCFunction
)
array_fromfile
,
0
,
fromfile_doc
},
{
"fromlist"
,
(
PyCFunction
)
array_fromlist
,
0
,
fromlist_doc
},
{
"fromlist"
,
(
PyCFunction
)
array_fromlist
,
0
,
fromlist_doc
},
{
"fromstring"
,
(
PyCFunction
)
array_fromstring
,
0
,
fromstring_doc
},
{
"fromstring"
,
(
PyCFunction
)
array_fromstring
,
0
,
fromstring_doc
},
/* {"index", (method)array_index},*/
{
"index"
,
(
PyCFunction
)
array_index
,
1
,
index_doc
},
{
"insert"
,
(
PyCFunction
)
array_insert
,
0
,
insert_doc
},
{
"insert"
,
(
PyCFunction
)
array_insert
,
0
,
insert_doc
},
{
"pop"
,
(
PyCFunction
)
array_pop
,
1
,
pop_doc
},
{
"read"
,
(
PyCFunction
)
array_fromfile
,
0
,
fromfile_doc
},
{
"read"
,
(
PyCFunction
)
array_fromfile
,
0
,
fromfile_doc
},
/* {"remove", (method)array_remove},*/
{
"remove"
,
(
PyCFunction
)
array_remove
,
1
,
remove_doc
},
{
"reverse"
,
(
PyCFunction
)
array_reverse
,
0
,
reverse_doc
},
{
"reverse"
,
(
PyCFunction
)
array_reverse
,
0
,
reverse_doc
},
/* {"sort", (
method)array_sort
},*/
/* {"sort", (
PyCFunction)array_sort, 0, sort_doc
},*/
{
"tofile"
,
(
PyCFunction
)
array_tofile
,
0
,
tofile_doc
},
{
"tofile"
,
(
PyCFunction
)
array_tofile
,
0
,
tofile_doc
},
{
"tolist"
,
(
PyCFunction
)
array_tolist
,
0
,
tolist_doc
},
{
"tolist"
,
(
PyCFunction
)
array_tolist
,
0
,
tolist_doc
},
{
"tostring"
,
(
PyCFunction
)
array_tostring
,
0
,
tostring_doc
},
{
"tostring"
,
(
PyCFunction
)
array_tostring
,
0
,
tostring_doc
},
...
@@ -1364,11 +1455,16 @@ Methods:\n\
...
@@ -1364,11 +1455,16 @@ Methods:\n\
append() -- append a new item to the end of the array
\n
\
append() -- append a new item to the end of the array
\n
\
buffer_info() -- return information giving the current memory info
\n
\
buffer_info() -- return information giving the current memory info
\n
\
byteswap() -- byteswap all the items of the array
\n
\
byteswap() -- byteswap all the items of the array
\n
\
count() -- return number of occurences of an object
\n
\
extend() -- extend array by appending array elements
\n
\
fromfile() -- read items from a file object
\n
\
fromfile() -- read items from a file object
\n
\
fromlist() -- append items from the list
\n
\
fromlist() -- append items from the list
\n
\
fromstring() -- append items from the string
\n
\
fromstring() -- append items from the string
\n
\
index() -- return index of first occurence of an object
\n
\
insert() -- insert a new item into the array at a provided position
\n
\
insert() -- insert a new item into the array at a provided position
\n
\
pop() -- remove and return item (default last)
\n
\
read() -- DEPRECATED, use fromfile()
\n
\
read() -- DEPRECATED, use fromfile()
\n
\
remove() -- remove first occurence of an object
\n
\
reverse() -- reverse the order of the items in the array
\n
\
reverse() -- reverse the order of the items in the array
\n
\
tofile() -- write all items to a file object
\n
\
tofile() -- write all items to a file object
\n
\
tolist() -- return the array converted to an ordinary list
\n
\
tolist() -- return the array converted to an ordinary list
\n
\
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment